Arquivo
Arquivos – WebCast DBA CheckList
Galera, conforme combinado segue o link para download dos arquivos que utilizei na WebCast da Sr.Nimbus onde falamos sobre tarefas que todo DBA deve analisar em um ambiente SQL Server.
https://skydrive.live.com/redir?resid=52EFF7477E74CAA6!2051
Para baixar o PPT de uma olhada aqui no post do Luti: http://luticm.blogspot.com.br/2012/06/dba-checklist-gravacao-e-material-do.html
Para quem perdeu a sessão ou não sabe do que eu estou falando, segue abaixo o video da sessão:
Abs.
SQLSat 147 Recife dia 25/08 e TDC dia 06/07
![]() |
![]() |
Galera, duas novidades rápidas, na próxima sexta-feira dia 06/07/2012 irei ministrar uma palestra no TDC (The Developers Conference), e no dia 25 de agosto irei ministrar a mesma sessão no SQL Saturday (#sqlsat147) que será em Recife.
O tema da sessão é a seguinte:
Ei dev, aprenda 7 maneiras diferentes para matar um DBA do coração
Descrição:
Nesta sessão o MVP em SQL Server Fabiano Amorim (@mcflyamorim) irá demonstrar 7 técnicas de desenvolvimento que irão fazer um DBA morrer do coração. Piores práticas para escrever uma consulta T-SQL (problemas com triggers, procedures, views e functions), piores práticas para desenvolver uma tela de consulta, desenvolvendo para não ter segurança. Performance? Não é preciso! Aprenda o que fazer e o que não fazer quando desenvolver para SQL Server.
Espero nos ver por lá
.
Abs.
WebCast Sr.Nimbus–DBA CheckList dia 21/06/2012
Ok, já sei, demorei, desculpa. Graças a Deus as coisas na Sr.Nimbus estão indo MUITO bem, o que nos fez atrasar um pouco em relação a nossa prometida, esperada e votada webcast.
Para quem não sabe do que estou falando, segue o link do post que falei sobre a WebCast da Sr.Nimbus.
O resultado da enquete foi bem interessante, e me mostrou que sim, tem gente que realmente lê o que eu escrevo neste blog
. Segue abaixo o resultado:
Como vocês podem ver, e para minha surpresa a WebCast sobre DBA CheckList foi a grande campeã com 39% dos votos, seguido do tema relacionado a T-SQL Avançado com 24%. Digo que fiquei surpreso porque sempre achei que o público do meu blog era maior por parte dos desenvolvedores e não de DBAs…
Bom, vamos a boa notícia. A boa notícia é que a WebCast já tem data, e será na quinta-feira dia 21/06, segue um resumo abaixo:
- Tema: DBA CheckList o que analisar?
- Apresentadores: Fabiano Amorim e Luciano Caixeta Moreira (blog|twitter) (a.k.a. Luti)
- Moderação: Um quando o outro estiver apresentando, e outro quando o um estiver apresentando. (e vice e versa)
- Data: Quinta-feira dia 21/06/2012
- Horário: Das 19:30 as 21:30
- Onde: Online
- Link para inscrição: http://tinyurl.com/WebCastSrNimbus
Caso qualquer problema ocorra antes/durante a apresentação, iremos atualizar este blogpost como mais detalhes.
Treinamentos SQL07 (QueryPlans) e SQL11 (T-SQLExpert) em SP
Galera, depois de muitos pedidos estamos abrindo turmas para horários noturno e diurno dos treinamentos de SQL Server da Sr.Nimbus…
Mais detalhes no site da Sr.Nimbus http://intranet.srnimbus.com.br/paginas/default.aspx
Qq coisa sabem onde me achar…
Abs.
Hypothetical indexes, making it easy to use…
Hi there, yes, I know, it’s being a while since I wrote something here… So, sorry about that.
Yesterday the guy I’m a big fan (if you already join one of my SQL trainings you know that
) Query Optimizer Guru Paul White (blog|twitter) answered a question on twitter (#sqlhelp hash tag) and he mentioned a post I wrote some time ago about hypothetical indexes on SQL Server. That is a very nice feature but unfortunately is not pretty to use because it requires you to use DBCC AUTOPILOT and set AUTOPILOT to ON…
The parameters you have to use are not straightforward to find and may discourage you to use it… I’ve created a procedure to make it a little easier to use.
Originally I created this procedure after a student question about how to make it easier to use hypothetical indexes on SQL Server. So I thought you may like it.
Unfortunately it relies on a CLR stored procedure to SET the AUTOPILOT, but if you don’t mind to use it in a develop environment (which is something normal to do) then you can use it, following is the CLR code, and if you are interested you can download the project code here:
-- CLR Proc /* using System; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes; using Microsoft.SqlServer.Server; public partial class StoredProcedures { [Microsoft.SqlServer.Server.SqlProcedure] public static void CLR_GetAutoPilotShowPlan ( SqlString SQL, out SqlXml PlanXML ) { //Prep connection SqlConnection cn = new SqlConnection("Context Connection = True"); //Set command texts SqlCommand cmd_SetAutoPilotOn = new SqlCommand("SET AUTOPILOT ON", cn); SqlCommand cmd_SetAutoPilotOff = new SqlCommand("SET AUTOPILOT OFF", cn); SqlCommand cmd_input = new SqlCommand(SQL.ToString(), cn); if (cn.State != ConnectionState.Open) { cn.Open(); } //Run AutoPilot On cmd_SetAutoPilotOn.ExecuteNonQuery(); //Run input SQL SqlDataAdapter da = new SqlDataAdapter(); DataSet ds = new DataSet(); da.SelectCommand = cmd_input; ds.Tables.Add(new DataTable("Results")); ds.Tables[0].BeginLoadData(); da.Fill(ds, "Results"); ds.Tables[0].EndLoadData(); //Run AutoPilot Off cmd_SetAutoPilotOff.ExecuteNonQuery(); if (cn.State != ConnectionState.Closed) { cn.Close(); } //Package XML as output System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument(); //XML is in 1st Col of 1st Row of 1st Table xmlDoc.InnerXml = ds.Tables[0].Rows[0][0].ToString(); System.Xml.XmlNodeReader xnr = new System.Xml.XmlNodeReader(xmlDoc); PlanXML = new SqlXml(xnr); } }; */
Following is the code to compile it on SQL Server and to create another procedure to simulate the hypothetical indexes:
-- Publishing Assembly IF EXISTS(SELECT * FROM sys.assemblies WHERE name = 'CLR_ProjectAutoPilot') BEGIN IF OBJECT_ID('st_CLR_GetAutoPilotShowPlan') IS NOT NULL DROP PROC st_CLR_GetAutoPilotShowPlan DROP ASSEMBLY CLR_ProjectAutoPilot END GO CREATE ASSEMBLY CLR_ProjectAutoPilot FROM 'C:\ProjectAutoPilot\ProjectAutoPilot\bin\Release\ProjectAutoPilot.dll' WITH PERMISSION_SET = SAFE GO CREATE PROCEDURE st_CLR_GetAutoPilotShowPlan (@Query NVarChar(MAX), @ShowPlan XML OUTPUT) AS EXTERNAL NAME CLR_ProjectAutoPilot.StoredProcedures.CLR_GetAutoPilotShowPlan GO IF OBJECT_ID('st_TestHipotheticalIndexes', 'p') IS NOT NULL DROP PROC dbo.st_TestHipotheticalIndexes GO CREATE PROCEDURE dbo.st_TestHipotheticalIndexes (@SQLIndex NVarChar(MAX), @Query NVarChar(MAX)) AS BEGIN SET NOCOUNT ON; BEGIN TRY BEGIN TRAN DECLARE @CreateIndexCommand NVarChar(MAX), @IndexName NVarChar(MAX), @TableName NVarChar(MAX), @SQLIndexTMP NVarChar(MAX), @SQLDropIndex NVarChar(MAX), @SQLDbccAutoPilot NVarChar(MAX), @i Int, @QuantityIndex Int, @Xml XML IF SubString(@SQLIndex, LEN(@SQLIndex), 1) <> ';' BEGIN RAISERROR ('Last caracter in the index should be ;', -- Message text. 16, -- Severity. 1 -- State. ); END SET @SQLDropIndex = ''; SET @QuantityIndex = LEN(@SQLIndex) - LEN(REPLACE(@SQLIndex, ';', '')) SELECT @SQLIndexTMP = SUBSTRING(@SQLIndex, 0, CharIndex(';', @SQLIndex)) SET @i = 0 WHILE @i < @QuantityIndex BEGIN SET @SQLIndexTMP = SUBSTRING(@SQLIndex, 0, CharIndex(';', @SQLIndex)) SET @CreateIndexCommand = SUBSTRING(@SQLIndexTMP, 0, CharIndex(' ON ',@SQLIndexTMP)) SET @IndexName = REVERSE(SubString(REVERSE(@CreateIndexCommand), 0, CharIndex(' ', REVERSE(@CreateIndexCommand)))) SET @TableName = SUBSTRING(REPLACE(@SQLIndexTMP, @CreateIndexCommand + ' ON ', ''), 0, CharIndex(' ', REPLACE(@SQLIndexTMP, @CreateIndexCommand + ' ON ', ''))) IF ISNULL(@TableName,'') = '' SET @TableName = SUBSTRING(REPLACE(@SQLIndexTMP, @CreateIndexCommand + ' ON ', ''), 0, CharIndex('(', REPLACE(@SQLIndexTMP, @CreateIndexCommand + ' ON ', ''))) SET @SQLIndex = REPLACE(@SQLIndex, @SQLIndexTMP + ';', '') --SELECT @SQLIndex, @SQLIndexTMP, @CreateIndexCommand, @TableName, @IndexName -- Creating hypotetical index IF CharIndex('WITH STATISTICS_ONLY =', @SQLIndexTMP) = 0 BEGIN SET @SQLIndexTMP = @SQLIndexTMP + ' WITH STATISTICS_ONLY = -1' END -- PRINT @SQLIndexTMP EXEC (@SQLIndexTMP) -- Creating query to drop the hypotetical index SELECT @SQLDropIndex = @SQLDropIndex + 'DROP INDEX ' + @TableName + '.' + @IndexName + '; ' -- PRINT @SQLDropIndex -- Executing DBCC AUTOPILOT SET @SQLDbccAutoPilot = 'DBCC AUTOPILOT (0, ' + CONVERT(VarChar, DB_ID()) + ', '+ CONVERT(VarChar, OBJECT_ID(@TableName),0) + ', ' + CONVERT(VarChar, INDEXPROPERTY(OBJECT_ID(@TableName), @IndexName, 'IndexID')) + ')' EXEC (@SQLDbccAutoPilot) --PRINT @SQLDbccAutoPilot SET @i = @i + 1 END -- Executing Query DECLARE @PlanXML xml EXEC st_CLR_GetAutoPilotShowPlan @Query = @Query, @ShowPlan = @PlanXML OUT SELECT @PlanXML -- Droping the indexes EXEC (@SQLDropIndex) COMMIT TRAN END TRY BEGIN CATCH ROLLBACK TRAN -- Execute error retrieval routine. SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_SEVERITY() AS ErrorSeverity, ERROR_STATE() AS ErrorState, ERROR_PROCEDURE() AS ErrorProcedure, ERROR_LINE() AS ErrorLine, ERROR_MESSAGE() AS ErrorMessage; END CATCH; END GO
The proc st_TestHipotheticalIndexes expect two input parameters:
- @SQLIndex: Here you should specify the command to create the index you and to try (the hypothetical indexes), if you want to try more than one index, just call it separating many “create index” commands by coma. For instance:
@SQLIndex = 'CREATE INDEX ix_12 ON Products (Unitprice, CategoryID, SupplierID) INCLUDE(ProductName);CREATE INDEX ix_Quantity ON Order_Details (Quantity);',
- @Query: Here you should write the query you want to try.
Here is a sample of how to call it on :
-- Sample 1 EXEC dbo.st_TestHipotheticalIndexes @SQLIndex = 'CREATE INDEX ix ON Order_Details(Quantity);', @Query = 'SELECT * FROM Order_Details WHERE Quantity < 1'
The results of the query above is an XML with the query plan considering the suggested index:
Another sample:
— Sample 2
-- Sample 2 EXEC dbo.st_TestHipotheticalIndexes @SQLIndex = 'CREATE INDEX ix_12 ON Products (Unitprice, CategoryID, SupplierID) INCLUDE(ProductName);CREATE INDEX ix_Quantity ON Order_Details (Quantity);', @Query = 'SELECT p.ProductName, p.UnitPrice, s.CompanyName, s.Country, od.quantity FROM Products as P INNER JOIN Suppliers as S ON P.SupplierID = S.SupplierID INNER JOIN order_details as od ON p.productID = od.productid WHERE P.CategoryID in (1,2,3) AND P.Unitprice < 20 AND S.Country = ''uk'' AND od.Quantity < 90'
Yep, now it is easier… Let me know what do you think and please don’t mind on the crappy code
in the proc to get the tablename, indexname…
Have fun…
SQLSat127 – Rio de Janeiro 14/04
|
|
Galera, depois de um tempo off participando do MVPSummit e do SQLBits (quando sair o vídeo eu falo melhor sobre isso aqui no Blog) estou aqui para falar do SQL Saturday 127.
Dessa vez o evento será no Rio de Janeiro e vou fazer a primeira sessão do dia falando sobre DBA CheckList, que por sinal, é o tema vencedor da enquete que publiquei no Blog… (faremos a WebCast depois que eu voltar do Rio).
Esses dias eu twitei dizendo que tinha tido uma ideia bem legal para o SQLSat127, e já que minha sessão foi aceita, vou colocar a ideia em prática. O que é? Surpresa
.
Quer saber? Venha assistir minha sessão no evento! ![]()
Uma coisa posso dizer, com certeza vai ser algo que você nunca viu em apresentações por ai… E se der certo (espero que de!) vai ser bem legal…
Também posso dizer que minha sessão não terá NENHUM slide, exatamente NENHUM… Ficou curioso? Que bom! ![]()
Abs.
Treinamento – TSQL Expert dia 17 de Abril em SP
|
Galera, dia 17 de Abril, irei ministrar um treinamento de T-SQL, é um novo treinamento que criamos na SrNimbus chamado T-SQLExpert, a ideia é que assuntos complexos e problemáticos no que diz respeito a performance sejam cobertos com vários exemplos e cases do dia a dia.
A ementa do treinamento ficou sensacional, eu confesso que eu mesmo ficaria doido para fazer um treinamento desses
.
http://intranet.srnimbus.com.br/treinamento/paginas/curso.aspx?COD=SQL11
Esse é um treinamento de T-SQL, se você gosta, te prometo que veremos MUITO desse tal de SQL durante o treinamento. PPTs de 40 slides? Nãaaaaaaaao! Vamos para prática!
Segue abaixo alguns comentários sobre cada módulo.
Módulo 01: Query Tuning
Neste módulo queremos tratar sobre metodologia para analise e performance de consultas, onde olhar? Como olhar? O que importa? Que ferramentas podem me ajudar? Tá bom ou tá ruim? Como simular 100 usuários rodando essa consulta? Debug ajuda?
Essas são algumas perguntas que quero responder neste módulo…
Módulo 02: Functions
Functions são comumente utilizadas, ainda que nem sempre com boa performance, elas tem suas vantagens e desvantagens. Quero mostrar neste modulo onde a coisa começa a ficar ruim, muito ruim e extremamente ruim?… Estatísticas em functions?… View ou function? Formatação no banco ou na app? Conheça as ciladas e cuidados…
Function é uma coisa boa apenas quando usada corretamente, aprenda como fazer isso.
Módulo 03: Views
Views indexada é uma das minhas opções prediletas em relação a tuning, eu normalmente digo que elas podem salvar o seu dia. Entenda neste módulo como usar, quando usar, e como contornar limitações das views indexadas.
Como analisar o impacto das views indexadas?
Date correlation optimization também será analisado neste módulo, que tal copiar a lógica do date correlation e usar no meu ambiente?….
Módulo 04: Objetos temporários, CTEs e TVP
Tabelas temporárias, CTEs, variáveis do tipo table, Table valued parameters… Esses são alguns itens que iremos analisar com detalhe.
Uma CTE por si só é melhor que uma subquery? Fazer “pre filtros” em uma CTE é uma boa técnica? E a recursividade, como uso? CTE + FOR XML?
E aqui, uso variável do tipo table ou tabela temporária? Qual a diferença entre esses objetos?
Módulo 05: Cursores e Funções de Ranking (windowing functions)
Aaaa nesse módulo eu vou me esbaldar… ![]()
Windows function é tudo aquilo que você sempre precisou, mas não sabia que precisava. Neste módulo irei explicar como elas funcionam e todos os detalhes em relação ao processamento interno e controle do frame de uma window.
Modulo 06: Triggers
Triggers são do capeta! Você já ouviu isso? Eu já, e concordo!
Agora, a pergunta é: Elas são sempre ruim?
Quando posso usar? Quais os prós e contras em relação ao uso de triggers, como otimizar o uso de triggers?
Modulo 07: TOP e CROSS APPLY
TOP e Apply? Sério um módulo inteiro só para isso?
Pois é se você não sabe porque incluí um modulo só para falar sobre isso, definitivamente você precisa ver esse módulo.
Muitas vezes, consultas complexas podem se resolvidas de forma bem simples utilizando estes comandos.
Módulo 08: Modificação de dados avançada
Sério, acho que dava para fazer um treinamento só sobre isso… Como importar os dados de forma mais rápida possível?
Como excluir uma grande massa de dados sem acabar com o servidor? Como fazer expurgo de dados? Como fazer um insert e um delete com apenas um comando? Como alterar o valor de uma coluna identity? Quem é melhor, MERGE ou UPDATE/INSERT/DELETE ? …
Módulo 09: Boas práticas e quebrando mitos
Quero acabar com todas suas dúvidas… por favor, me pergunte!
Além de acabar com os mitos, quero perder um tempo falando sobre alguns problemas comuns e mostrar soluções espetaculares (não tem outro nome, realmente é espetacular).
Preciso dizer algo? Leia os itens que veremos por aqui:
• Dicas avançadas de T-SQL
o Resolvendo o problema de consultas com LIKE ‘’%%”
o Consultando intersecções de datas – RI-Tree
o Consultas dinâmicas
o Muito mais…
• Quebrando mitos
o COUNT(1) versus COUNT(*)
o JOIN versus EXISTS
o DISTINCT versus GROUP BY
o SET versus SELECT
o TOP 1 ORDER BY DESC versus MAX
o UNION versus UNION ALL
o NOT IN versus NOT EXISTS
o CURSOR versus WHILE
o Ordem das tabelas no JOIN
o Joins – Merge vs Loop vs Hash
o Foreign Key ou não?
Modulo10: Unit Test com T-SQL
Testes unitários é um módulo que o Luti fez eu incluir no treinamento
. Ele escreveu sobre isso no MVP Deep Dives 2, vai por mim, é muito mais importante do que você pensa. Já pensou ter um código para teste de TUDO o que sua equipe de desenvolvimento escreve em T-SQL? Só vai para homologação depois de passar pelos testes, aumenta qualidade, diminui custo de manutenção, bugs… Sonho? Não, longe disso, pura realidade.
Modulo11: Stored Procedures
Neste módulo quero criar polemica, e ver os alunos nervosos!
.
Sim, vamos criar uma proc para cada tabela? Ou melhor, 4 procs para cada tabela? Regras de negócio, vai no banco ou fica na App? Ora, usar procedures tem algum beneficio? Eu acho que não, mas também acho que sim! Ou seja, quero que você me convença da sua ideologia (
) em relação a isso, vamos ver os detalhes de cada um destes itens, e após conhecer tudo sobre elas, dai sim, decidiremos se damos fim a elas, ou se desejaremos vida longa as procedures!
O treinamento é de apenas 4 dias, mais informações aqui no site da SrNimbus http://intranet.srnimbus.com.br/paginas/noticia.aspx?ID=33 não deixe de perguntar caso tenha alguma dúvida, vocês sabem onde me achar… ![]()
Este treinamento está tendo bastante procura, portanto não deixe pra se inscrever de última hora ok ? As vagas são limitadas.
Abs.
WebCast gratuita – Sr.Nimbus
Fabiano VS PerfMon Counters que não aparecem
Já aconteceu com você de precisar ler alguns contadores de performance do SQL Server no PerfMon e eles não aparecerem?
Eu já havia passado por esse problema e confesso que não entendia porque os contadores do SQL não estavam lá na listinha do perfmon.
Estou trabalhando em mais um script para o repositório do DBCC CHECK_BD () da SrNimbus e os contadores relacionados ao SQL Server da minha máquina não estavam disponíveis, o que fazer?
Eu precisei reinstalar os contadores da minha instancia SQL. Para fazer isso execute os seguintes passos:
1. Abrir o cmd.exe (linha de comando)
2. Desinstalar os contadores relacionados a instancia:
a. Instancia default: unlodctr MSSQLSERVER
b. Instancia nomeada: unlodctr MSSQL$NOMEDAINSTANCIA
3. Instalar os contadores usando o arquivo de configuração dos contadores (arquivo .ini). Este arquivo fica na pasta BINN do SQL Server, no meu caso estava em “C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2_1\MSSQL\Binn”
a. lodctr /T:”C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL2008R2_1\MSSQL\Binn\perf-MSSQL$SQL2008R2_1sqlctr.ini”
b. O parâmetro /T é importante para marcar os contadores como uma fonte confiável (T de trusted)
4. Reiniciar o serviço do SQL Server. L deve ter um jeito mais fácil, sem necessitar reiniciar o serviço, mas eu só consegui assim. Se você descobrir/souber me avisa.
Segue um print dos comandos que rodei na minha maquina.
Após isso os contadores devem aparecer por lá.
Abs.
SQLSaturday 127–Rio de Janeiro 14/04
|
Ano passado tive o prazer de participar do SQLSaturday100 em São Paulo. O evento foi sensacional, com repercussão muito boa e palestras excelentes. Foi novamente uma ótima oportunidade para rever os amigos e fazer novos. Sempre acho que além de fazer amigos e aprender com os palestrantes, o evento é sem dúvida um ótimo lugar para fazer networking. |
Depois do sucesso do #SQLSat100 o próximo encontro já está marcado, será no Rio de Janeiro no dia 14/04. Anote na sua agenda, estarei lá, ainda não sei se estarei como palestrante ou ouvinte. Eu submeti duas sessões, agora é esperar e torcer pra ver se me escolhem como palestrante novamente. O call for speakers esta aberto, se você deseja participar como palestrante e quer submeter uma palestra clique no seguinte link http://www.sqlsaturday.com/127/callforspeakers.aspx
Mais informações sobre o evento: http://www.sqlsaturday.com/127/eventhome.aspx
Para ver as sessões submetidas: http://www.sqlsaturday.com/127/schedule.aspx
See you there!







