Archive

Posts Tagged ‘SQL Performance’

Conhecendo um pouco de performance

Fala Galera, boa noite.

Tudo bem? Faz tempo neh!? Hoje não colocarei o desafio de T-SQL (não ainda..rs). Hoje vim pra divulgar um assunto que também estava ficando um pouco desatualizado ,mas, como algumas pessoas não conseguiram comparecer e algumas não ficaram sabendo, estou divulgando aqui no blog.

No dia 03/12 tivemos a última reunião, do ano de 2015, do SQLManiacs  organizada pelo Vitor Fava, onde eu falei um pouco de performance e tuning (novidade..) utilizando alguns cenários práticos do dia-a-dia.

Para quem tiver interesse em reproduzir todos os cenários descritos na reunião, basta fazer o download dos scripts através do link abaixo:

Reunião do SQLManiacs – Conhecendo um pouco de performance

Ou ir até o blog do Fava, pois, lá possui mais algumas informações, fotos e etc.

https://vfava.wordpress.com/2015/12/08/reuniao-do-sqlmaniacs-conhecendo-um-pouco-de-performance-3/

Muito Obrigado e até a próxima

 

 

Advertisements

Criando Relatório de Performance e Tuning

Olá pessoal.

Durante o evento do SQL Saturday gostaria de ter mostrado como nós criamos relatórios de performance utilizando arquivos .blg gerados pelo Perfmon. Como não foi possível, estou escrevendo essa dica aqui no blog.

Primeiramente é muito comum em uma análise de performance nós utilizarmos o perfmon para coletar contadores de performance, pois, o mesmo não gera um alto “overhead” para o ambiente e pode lhe mostrar de forma clara aonde está o problema (se você souber relacionar os dados do Perfmon, é claro), no entanto, não mostra qual é a causa raiz do problema. Para esse artigo, não temos a intenção de mostrar como é criado a coleta e o PORQUE dos contadores (ver as referências no fim do artigo), isso será feito em artigos adiantes que irei escrever aqui. O principal objetivo deste post é mostrar: COMO CRIAR UM RELATÓRIO em uma coleta já realizada com o Perfmon.

No meu exemplo utilizarei o arquivo TracePerfmon.blg que deixei realizando uma coleta na minha máquina, conforme pode ser visto abaixo:

 

Figure 1 – Gráfico do Perfmon padrão

 

Agora imagine o presidente da sua empresa ou o seu gerente olhando para esse gráfico para tentar relacionar os dados! Você não verá uma cena muito agradável…rs.

Como posso transformar essas informações de uma maneira que seja fácil para ler? Para quem ainda não conhece, existe uma ferramenta via linha de comando chamada “relog” a qual utilizaremos nesse artigo.

 

 

Utilizando o relog.

O relog extrai informações dos contadores de performance do perfmon e pode transformá-los em outros formatos como text-TSV, text-CSV, SQL e etc.

Abra o prompt de comando do SQL Server e digite o seguinte comando: relog/?

 

Figure 2 – Instrução “Help” do relog

Aperte “Enter“. Será exibido um help dos parametros do relog e algumas sintaxes de como você pode utilizar o comando.

 

Figure 3 – Exemplos de utilização do relog.

Obs: Nesse post não entraremos no mérito de explicar o que significa cada parâmetro, no entanto, existe uma referência do relog no fim do artigo.

Transformando o binário em CSV

Agora que sabemos utilizar o relog, precisamos ir até a pasta onde encontra-se nosso arquivo .blg para poder transformar o arquivo em .CSV.

Figure 4 – Caminho de onde está o arquivo .blg

 

Agora que naveguei até a pasta basta apenas digitar o comando abaixo e apertar o “Enter” para que o arquivo .CSV seja gerado.

 

Figure 5 – Transformação do .blg para .csv, após o relog

 

A hora da Mágica

Com o arquivo .CSV gerado nós iremos importá-lo no excel, para isso, abra o excel e clique em “Data” e “From Text“.

 

Figure 6 – Importando dados no excel através de fontes de texto.

 

Localize o arquivo .CSV que foi gerado através do comando relog e clique em “Importar“. Aparecerá uma tela com o primeiro passo da importação do arquivo, mude para “Delimited” e clique em next, sua tela deve ficar como a imagem abaixo:

 

Figure 7 – Passo 1 da importação

 

A tela seguir irá definir quais caracteres são os seus “delimitadores“, deixe a tela como a tela a seguir:

 

Figure 8 – Passo 2 da importação

O ultimo passo apenas determina a formatação das colunas, deixe como está, no caso “General” e clique em “Advanced“. Uma tela irá se abrir:

 

Figure 9 – Definindo separadores.

Esse é um ponto extremamente importante, pois, dependendo do idioma utilizado essas infomrações podem vir divergentes, causando uma pequena mudança no momento da formatação dos dados. Deixe o separador de decimal como “Ponto” e o separador de milhares como “virgula” e clique em “OK” e “Finish“.

Criando os Gráficos

Após o arquivo ser importado para o excel, remova a segunda linha da planilha, conforme pode ser visto na imagem abaixo:

Figure 10 – Removendo a segunda linha da planilha

 

Após a linha ser removida, formate a primeira coluna da planilha excel para data utilizando o “Custom Format” das células. Sua data deve ficar algo parecido como no “Sample“.

 

Figure 11 – Formatação Excel da coluna de Data.

 

No momento que a nossa data estiver formatada, apenas precisamos adicionar uma nova coluna no arquivo excel, que será chamada de “Hora“.

Nós iremos extrair da coluna da data formatada anteriormente apenas as horas para que possamos fazer nosso relatório de “hora-em-hora“. Poderíamos fazer também de “minutos-em-minutos“. Lembrando que as colunas que serão transformadas em “Horas” deve estar como “General“, conform imagem:

Figure 12 – Aplicando a função de hora para a nova coluna

 

Após o passo anterior realizado, seu arquivo de excel deverá ficar mais o menos com o arquivo abaixo:

 

Figure 13 – Arquivo Excel “pronto” com a coluna de minutos incluso.

 

No momento que as colunas estão criadas, apenas precisamos criar um “Pivot Chart e Pivot Table” para montar os gráficos:

 

Figure 14 – Criando a Pivot Table e o Gráfico

A seguinte tela aparecerá, apenas informe o “Range” das informações que farão parte do gráfico, no nosso caso, todas as células. Deixe como a seguir e clique em “OK“.

 

Figure 15 – Determinando quais informações farão parte do gráfico e da tabela.

 

Agora os Mestres em Excel podem utilizar a sua imaginação para fazer relatórios necessários com os contadores de performance. Como não faço parte deste grupo seleto de mestres, apenas criei um relatório básico que: mostra as informações da “Média de Batch Requests/sec por hora” do período da coleta.

 


Espero que tenham gostado!!!

Até a próxima

Thiago Carlos [TC] de Alencar

 

 

Referências

Relog:

http://technet.microsoft.com/en-us/library/bb490958.aspx

Performance Counters PDF

http://www.quest.com/techbrief/sql-server-perfmon-counters-poster811635.aspx

Criando coletores de performance

http://technet.microsoft.com/en-us/library/cc749337.aspx


 

Create Index não é Tuning II

Esse post é dedicado a um grande amigo que me ensinou muito sobre Tuning e Performance um dos melhores DBAs que conheci, Sergio Bonsague.

Esse artigo é continuação do último post lançado aqui no blog. A coisa mais divertida no SQL Server é saber, porque ele fez isso ou aquilo? Por que “tal” decisão foi tomada, entender um pouco desse mundo obscuro…rs. Vamos parar de tagarelar e colocar a mão na massa.

Se analisarmos o plano de execução do post print, o SQL Server escolheu utilizar um Clustered Index Seek para ler toda a tabela. Porém, fica a pergunta, Ele não poderia ter escolhido um Clustered Index Scan? Como vou ler tudo, um Scan não é melhor que um Seek? A resposta é: Depende.

Executando duas vezes a mesma query, uma com o HINT WITH(INDEX=0) que força a Não utiliza do Index da tabela e uma sem utilização de hint, para que possamos comparar o antes e depois.

 

Executando a query forçando um Clustered Index Scan Vs um Clustered Index Seek podemos ver que no plano de execução o custo de ambos é  de 50% (Atual e Estimado).

ambosPlano

 

Thiago, que dizer que é a mesma coisa? A resposta é não. Quando se está avaliando performance, o ideal também é utilizar como parâmetro os tempos de execução, para isso sempre uso o Profiler. A quantidade de leitura é muito menor quando utilizamos um Clustered Index Seek, Vejamos o resultado:

EvidenciaProfiler

 

O SQL Server realizou uma quantidade menor de leituras utilizando o Index Seek. Mas, porque?

No Seek temos duas propriedades que não aparecem no Scan que no caso é a “Direção da Leitura”, como pode ser visto utiliza o “FORWARD” e está marcada como “ORDERED” como True.

ClusteredIndexSeek

 

Já o Clustered Index Scan, essas propriedades não são apresentadas. É a única questão que acredito ser o motivo.

ClusteredIndexScan

 

 

Esperam que vocês tenham gostado.

 

O que é o DTA?

Amigos da comunidade, blz? Esse post é dedicado a um outro amigo de trabalho. O DBA Felipe Melo , conhecimento SQL Geek em replicação, tunning e T-SQL. Sempre trocamos uma “figurinha” nos desafios profissionais, afinal, sempre é bom ter uma outra opinião. A certeza é: Nunca estamos totalmente certos! Mão na massa!?

O Database Engine Tuning Advisor é uma das “novas” features do SQL Server, ele analisa arquivos de carga de trabalho e propõe alterações no banco de dados, a fim de melhorar seu desempenho geral.

Para as alterações propostas, o Tuning Advisor também mostra o impacto que causará cada modificação.

Entre as suas capacidades, estão:

  • Query Optimazer, para propor índices e visões indexadas;
  • Recomendação de particões;
  • Análise de impacto das recomendações;
  • Fornecimento de informações sobre o número de consultas e o número de índices.

Opções de ajuste:

  • Quais objetos o Tuning Advisor poderá recomendar;
  • Quais partições analisará;
  • Quais estruturas serão mantidas no banco de dados;
  • Espaço máximo para recomendações;
  • Número máximo de columas por índice.

Criando analises com o DTA

Para iniciar o DTA, vá em StartAll / Programs / Microsoft SQL Server 2008 / Performance Tools / DataBase Engine Tunning Advisor.

Quando o programa for iniciado, clique em File/New Connection.

Aparecerá a tela de conexão para qual servidor você deseja criar a análise

Obs: Para o exemplo será usado um ambiente de testes.

O servidor será mostrado no canto superior direito da tela, clique com o botão direito e escolha a opção New Session.

A seguinte tela será mostrada:

Clique na guia Tunning Options e será mostrado a seguinte tela:

Physical Design Structure(PDS) to use in database: Esta opção avalia o que a Engine do DTA irá analisar referente a objetos de design na estrutura do banco(índex,índex views e etc). A opção de Índex views é desabilitada no SQL Server STD.

Partitioning strategy to employ: A opção de particionamento, verifica se existem objetos que podem ser particionados e avalia o particionamento que já existente. Disponível somente na versão Enterprise do SQL Server.

Physical Design Structure(PDS) to keep in database: Avalia a estrutura fisica do banco, abalia se existem índices clustereds e nonclustereds devem ser deletados(ele não deleta os indices), ou se existe algo divergente na no modelo como um todo. O padrão é Keep All existing PDS.

Voltando a guia General, aonde:

  • Session Name: Nome da Sessão
  • WorkLoad: A origem de ondes virão os dados que serão analisados(no caso do profiler o mesmo pode ser um arquivo ou uma tabela)
  • DataBase for WorkLoad Analysis: Aonde serão gaurdadas as analises temporarias.
  • Select DataBase and tables to tune: Lista de banco de dados e de tabelas que serão parte da analise. (sempre coloque os bancos de dados que [*] foram filtrados no profiler)

Coloque o nome no profiler e escolha o caminho aonde está o arquivo de trace do profiler. Ao clicar no Radio Button File, clique no binóculo a esquerda e será aberta a tela do Windows. Escolha o profiler que deseja analisar.

Clique em abrir.

Caso o trace tenha sido guardado em uma tabela, marque o Radio Button Table, clique no binóculo a esquerda e será aberta a tela de conexão:
Escolha qual banco, schema e tabelas estão os profilers que foram armazeandos.

Obs:  O login qual abriu a sessão no DTA deve ter acesso as tabelas que estão os traces, caso contrário, uma mensagem de erro será retornada.

 

O preenchimento deve ficar parecido com a tela abaixo:

 

Clique no botão Start Analysis. Após clicar em Star Analysis, uma tela de progresso será exibida.

 

Na guia recomendações, é apresenta a porcentagem de melhoria da análise.

 

No menu Actions aparecerá a opção de aplicar as recomendações ou savá-las.
Clique em Save Recommendations

Será gerado um arquivo .sql com as recomendações.

Espero Ter ajudado

 

Brinquedinho de Processamento

Galera, boa noite.

Pra descontrair!! Esse é o meu mais novo brinquedinho……

 

Por enquanto o SQL Server dorme…

Conhecendo Indices Step-by-Step V

Fala Galera, blz? Bem vindos ao quinto artigo da série “Conhecendo Indices Step-By-Step”. Esse post é dedicado a Bianca Almeida de Oliveira, que esta sempre ao meu lado , minha incrível esposa. Hoje iremos ver como o SQL Server acessa os dados de um índice nonclustered em uma tabela clusterizada. Na seção três vimos como o SQL Server usa o RID para encontrar um registro especifico, conhecido como RID Lookup. A técnica aplicado para o caso de hoje é o que chamamos de KeyLookup. Vamos a prática:

Neste exemplo usaremos uma tabela chamada TB_CLIENTES que possui apenas um índice clustered na coluna ID_CLIENTE. Fazendo a query a seguir, o SQL Server optou por usar um Clustered Index Scan, vejamos:

SET STATISTICS IO ON

SELECT ID_Cliente, Nome, Col1

FROM TB_CLIENTES

WHERE Nome = ‘Colin B9A7D004’

SET STATISTICS IO OFF

Abaixo o resultado e o plano de execução:

Plano de execução:

Voltando as posts iniciais desta série é correto afirmar que os índices são construídos em estruturas B-Tree. No nosso plano o que foi apresentado foi um clustered index scan, mas, será que não seria interessante criarmos um nonclustered index por nome? Vamos avaliar?

CREATE NONCLUSTERED INDEX IXNC_Nome ON TB_CLIENTES(Nome)

Ao criar o índice, podemos afirmar que o SQL Server utilizará o índice para buscar os nomes, porém, como foi dito nos posts anteriores: O SQL server cria uma estrutura B-Tree pra cada índice e neste caso é o nome. Pare um pouco e pense caro leitor, a query apenas solicita o nome? NÃO. Ela ainda precisa retornar para o cliente a coluna Col1 e o Id_cliente, como o SQL Server busca essa informação? Ao executar a mesma query do inicio do artigo, podemos perceber que o SQL Server apenas efetuou seis leituras lógicas e fez o que chamamos de KeyLookup:

O KeyLookup pode ser visto como um dos responsáveis por alto custo no plano de execução:

Thiago! Não entendi, como o SQL Server fez isso? Vamos simular a leitura dos índices para entender esse comportamento.

Obs: Lembrando que o conceito, é muito parecido com os posts anteriores.

Tendo como base o comando DBCC PAGE gerado, vamos começar a leitura.

SELECT dbo.fn_HexaToDBCCPAGE(Root), *

FROM sys.sysindexes

WHERE name = ‘IXNC_Nome’

AND id = OBJECT_ID (‘TB_CLIENTES’)

DBCC TRACEON (3604)

DBCC PAGE (31,3,303,3) — 1º Leitura

Baseando-se no resultado do print, foram retornados dois registros. A pergunta é: A letra “C” vem antes ou depois da letra “J”? Resposta fácil: Que dizer que nossa próxima leitura é na ChildPageId 26528.

DBCC PAGE (31,3,26528,3) — 2º Leitura

Na nossa segunda leitura podemos ver que o cliente Colin B9A7D004, pode estar dentro da página 26661 ou 26662. Mas qual será a página certa? Posso afirmar com certeza que é a página 26661, pois, o cliente Colin que procuramos começa com B e em uma ordenação, os números sempre veem antes das letras. Que dizer que o cliente Colin 90026186 está antes do Colin B9A7D004. Vamos para a terceira leitura:

DBCC PAGE (31,3,26661,3) — 3º Leitura

EURECA! Encontramos nosso cara! Se você que está lendo, vem acompanhando todos os artigos da série, você deve se lembrar que quando fizemos essa mesma quantidade de leitura para uma Heap, encontramos uma coluna de nome “Heap RID (Key)” com valores em hexadecimais. Como estamos falando de uma tabela Clusterizada, temos a referência do nosso índice clustered (Coluna id_cliente(Key)) dentro do índice nonclustered. Thiago! Que dizer que todos nonclustered indexes possui o clustered index? CORRETO.

Obs: Muito cuidado ao escolher seus clustereds index. Caso você tenha uma tabela com um índice clustered composto por três colunas. E nesta tabela você tenha dois nonclustered indexes…as três colunas do índice clustered irá aparecer no índice nonclustered. Isso é um grande vilão de performance. Fique sempre atento: PERFORMANCE COMEÇA NA MODELAGEM.

Voltando ao assunto do post: A partir daqui fizemos três leituras, mas, o SQL Server apenas sabe qual o nome do cliente que ele está buscando no índice e automaticamente seu id_cliente que é 77939. Mais uma pergunta! Então, até agora apenas navegamos na estrutura B-Tree do índice nonclustered Thiago? Sim. Agora o que o SQL Server faz é pegar a “chave” e navegar na estrutura do índice clustered. Vamos então a quarta leitura? Mas, primeiro precisamos retornar o DBCC PAGE do índice clustered:

SELECT dbo.fn_HexaToDBCCPAGE(Root), *

FROM sys.sysindexes

WHERE name = ‘PK’

AND id = OBJECT_ID (‘TB_CLIENTES’)

DBCC PAGE (31,3,295,3) — 4º Leitura

Novamente a pergunta que o SQL Server faz. O valor de id_cliente 77939 é maior que o id_clente 40899? A resposta é sim. Vamos a quinta leitura, tendo como base a ChildPageID 19328.

DBCC PAGE (31,3,19328,3) — 5º Leitura

Como podemos ver, o cliente de id 77939 encontra-se dentro da página 20241 onde o id_cliente 77913 é menor que o id_cliente 77939. Vamos para a sexta e última leitura:

DBCC PAGE (31,3,20241,3) – 6º Leitura Encontramos o ID_Cliente = 77939

Pronto! Simulamos as seis leituras lógicas do SQL Server. Thiago uma pergunta! Como faço pra evitar que o SQL Server faça as últimas três leituras adicionais? Não seria mais performático pra ele achar a Col1 quando chegar no nível folha do índice nonclustered? A resposta é: Sim, seria mais fácil. No próximo post sobre índices, veremos uma das features que surgiu a partir do SQL Server 2005, o Covered Index que particularmente acho incrível.

Espero ter ajudado

Thiago Carlos [TC] de Alencar

Conhecendo Indices Step-by-Step IV

Boa tarde, comunidade SQL Server. Dando continuidade a série “Conhecendo índices Step-By-Step”. No  último artigo foi abordado como o SQL Server navega em um índice nonclustered em uma heap. Já neste artigo mostraremos como o SQL Server navega em um clustered index.

Iremos utilizar uma tabela chamada ClusteredTable que tem apenas um clustered index. A coluna que estamos falando é a coluna id_cliente. Iremos executar a query e analisaremos o plano de execução gerado.

SET STATISTICS IO ON

SELECT * 

  FROM ClusteredTable

 WHERE ID_Cliente = 500

SET STATISTICS IO OFF

Plano de execução:

Resultado:

Leituras lógicas realizadas foram três, uma a menos do que no nonclustered index do artigo anterior. Vamos entender? O procedimento de verificar as leituras é idêntico ao do artigo anterior.

Executaremos a query com a função que nos traz o comando dbcc.

SELECT dbo.fn_HexaToDBCCPAGE(Root), *

  FROM sys.sysindexes

 WHERE name = ‘PK_CL’

Abaixo executo os comandos dbcc onde encontra-se o registro:

DBCC TRACEON (3604)

DBCC PAGE (31,3,288,3)  — 1º Leitura

A segunda leitura resume-se na ChildPageId 14728.

DBCC TRACEON (3604)

DBCC PAGE (31,3,14728,3) — 2º Leitura

Como pode ser visto, o id_cliente 500 encontra-se na página 14606. Mas como assim? O motivo é porque página 14606 começa no id_cliente 443 e termina no id_cliente 516 que é onde começa a próxima página. Executando o comando dbcc podemos confirmar isso:

DBCC TRACEON (3604)

DBCC PAGE (31,3,14606,3) — 3º Leitura Encontramos o ID_Cliente = 500

No resultado da nossa terceira leitura podemos ver que o registro está lá no slot 57. Até o próximo post. E o assunto a ser falado será!? Suspense. Index..rs