Fernando's profileAbout Microsof SQL Serve...BlogListsNetworkMore Tools Help

About Microsof SQL Server

SQL Server 2008 your data any place,any time

Fernando Garcia

Occupation
Location
Meu nome é Fernando Garcia trabalho com SQL SERVER 2000/2005 desde 2005,com foco no produto SQL SERVER,tanto BI como administração e programação transact sql.Possui as seguintes certificações MCP,MCTS(2005/2008) e MCITP database administrator.Atualmente trabalho como DBA em uma multinacional,sendo lider mundial em seu ramo.
April 26

Gargalo de CPU Parte 2

Compilação e recompilação.

 

Quando uma query é executada pela primeira vez o sql server executa uma serie de procedimentos,mas a grosso modo ele compila a consulta e gera um plano de execução otimizado e executa o comando.Esse plano de otimização que ele gerou ele deixa em uma área reservada chamada procedure cachê,o procedure cachê armazena todos os comandos que executamos no sql server.Se executarmos esse comando novamente o sql server primeiro checa se existe já esse plano otimizado no procedure cachê se existe ele re-utiliza o plano de excução gerado,diminuindo o uso da cpu,pois não é preciso executar novamente um plano de execução para a consulta.Segue abaixo alguns exemplos que força o sql server recompilar o seu comando gerando um custo maior para a CPU.

*Mudança na estrutura do objeto – Se o objeto referenciado(uma tabela) é mudado,causa uma recompilação nos objetos que se referenciam a ele,também se temos um comando que junta comandos DDL(create,alter,drop) e DML(Select,Insert,Update,Delete),isso vai gerar uma recompilação.

*Set option – Tem algumas opções que quando referenciada em criação de procedures gera uma recompilação do objeto toda vez,como ANSI_PADDINGS,ANSI_NULLS,ANSI_NULL e ARITHABORT,se usarmos essas opções durante uma batch,vai forçar uma recompilação.

*Atualização de estatística – como já era de se esperar se atualizarmos as estatísticas e essa informação for muito significante,o slq server ira recompilar sua batch,pois lembra como foi comentado o sql server é baseado em custo para otmizar,e a primeira coisa que ele verifica é a informação das estatísticas,mas toda vez que for atualizada vai recompilar?A resposta é NÃO,somente se tivermos uma mudança muito grande,por exemplo tenho um índice nonclustered que foi atualizado dia 1 de janeiro pela ultima vez e hoje(26 DE ABRIL) atualizo ele,mas somente 10 registros foram incluídos,isso é uma mudança drástica?NÃO,mas se no caso foram atualizados 100000 registros,no caso é uma mudança drástica,pois o otimizador de consulta terá que mudar a sua estratégia de otimização do plano de execução.

*E por fim como o próprio nome diz,a opção RECOMPILE especificada em uma stored procedure sempre recompilara o plano de execução toda vez que for executada,isso é ruim?Depende do seu código.Falo sempre para as pessoas,isso depende do ambiente e da query.

No sql server 2005 temos 3 maneiras de visualizar o gargalo causado por compilação e recompilação,uma é usando o System Monitor,a outra o profiler e por fim as na minha opinião FANTÁSTICAS DMV e DMF.

No system monitor podemos usar a SQLSERVER:SQL Statistics: Batch/Sec, SQLSERVER:SQL Statistics: SQL Compilations/Sec e SQLSERVER:SQL Statistics: Recompilations/Sec .

Para verificarmos se temos gargalo,basta fazer uma correlação do contador Batch/sec(Comandos enviados as seu servidor por segundo) com os contadores compilations e recompilations,se os contadores de compilação e recompilação estiver quase no mesmo nível do batch/sec estamos tendo um gargalo e precisa ser avaliado novamente o  seu ambiente usando o profiler e/ou DMV´s.

Abaixo esta uma query que mostra quanto tempo o sql server gasta para otimizar a consulta:

 

 

SELECT * from sys.dm_exec_query_optimizer_info

Where counter = 'optimizations' or counter = 'elapsed time'

 

Esses contadores são acumulativos desde que a instancia do sql server foi iniciada,o interessante é fazer “snapshot” desse comando comparando dias.O 'optimizations' representa o numero total de query/batch e o elapsed time represente o tempo tempo gasto em segundos para otimizar a consulta.

Também podemos verificar quais são as querys que mais geraram recompilação.

 

Select top 10 plan_generation_num,execution_count,

 

(select substring(text,statement_start_offset/2 + 1,(case when statement_end_offset = -1 then len(convert(nvarchar(max),text)) * 2

Else statement_end_offset

End  - statement_start_offset)/2)

From sys.dm_exec_sql_text(sql_handle)) as query_text

 

From sys.dm_exec_query_stats

Where plan_generation_num>1

Order by plan_generation_num desc

 

Também é possivel que ,se voce esta encontrando um grande numero de compilações,pode ser que o sql server esteja com gargalo de memória,pois ele pode esta tirando os plano de execução da memória.Um comando que eu estou procurando conhecer é o DBCC MemoryStatus que nos mostra como que esta ditribuida nossa memória no sql server nos componentes que ele usa,como o procedure cachê,buffer manager e etc...

 

Com isso finalizamos um dos gargalos que existe no caso na CPU,no próximo post estarei falando do gargalo de memória.

Abraços e até a próxima.

April 24

Gargalo de CPU Parte 1

 

 

Antes de mostrar como detectar o gargalo de CPU,temos que entender como que a CPU interage com o sql server,a grosso modo ele é responsável por parse\Otimização da query.Mas vamos falar de processos.Hoje internamente o sql server tem os works que nada mais nada menos são as threads (1:1) ou fiber(quando o lightweight pooling esta habilitado)(1:N) que são vinculadas a um scheduler para a execução das tarefas,cada scheduler é uma CPU lógica utilizada pelo sql server,e quem gerencia isso advinha?o SQLOS(esse conteúdo é falado no livro storage engine e pelo webcast do Luciano mencionado no post anterior).Quando uma query é solicitada ela é atrelada a 1 worker para execução,se ela precisa de processamento paralelo,ela é vinculada a mais de 1 worker.Depois que a consulta é feita e ocorre todo os processamento e retorna  a resposta para o usuário,esse worker é liberado e pode ser preenchido por outra solicitação de código transact-sql conhecido nesse modo como batch ou request.

Um worker pode estar em vários estados mas os mais interessantes são RUNNING,RUNNABLE E SUSPENDED.

 

Running – O worker esta sendo executado no momento na CPU

Runnable – O worker esta esperando a liberação de um worker terminar para ele ser processado.

Suspended – O worker esta a espera através de um recurso que no caso pode ser lock ou I/O no disco.

Para identificar um dos gargalos de CPU basta termos um grande numero de worker em um estado Runable.

Outra maneira de identificar o gargalo seria usando o system monitor monitorando o contador Processor:%ProcessorTime,se esse valor é muito alto(acima de 80% durante 15 a 20 minutos recomendado pela microsft),voce tem um gargalo,mas vale lembrar que esse numero varia de ambiente para ambiente,por exemplo se voce não tem muito recurso de hardware e esta fazendo uma carga de bilhões de registros e com muita concorrência no sql server,é lógico que voce vai elevar o numero de cpu,lembre-se do artigo anterior falando sobre avaliar TODO ambiente.Outro contador que pode demonstrar gargalo de CPU é o contador System:Processor Queue Lenght,um valor igual a 2 ou superior mostra um gargalo de CPU.Um outro jeito de voce achar o gargalo de CPU é usando as DMV procurando pelo estado de RUNNABLE.

 

Select COUNT(*) as Workers_Waiting_for_CPU,t2.Scheduler_id

From sys.dm_os_workers as t1 inner join sys.dm_os_schedulers as t2

On t1.scheduler_address = t2.scheduler_address

Where t1.state = 'Runnable' and t2.scheduler_id < 255

Group by t2.Scheduler_id

 

Também podemos ver usando a dmv qual o tempo gasto pelo worker em um estado de RUNNABLE:

Select sum(signal_wait_time_ms)

From sys.dm_os_wait_stats

 

OBS:SEMPRE que for utilizar uma DMV ou DMF,veja no books online qual o impacto da mesma,pois  ela mesmo pode gerar um alto custo de CPU,portanto entenda antes de usa-las,existem 2 que  por exemplo pode causar um uso da cpu que são sys.dm_tran_version_store ou sys.dm_os_buffer_descriptors .

 

Agora nos perguntamos o que mais pode causar gargalo de CPU?

Um ineficiente plano de execução e uma grande solicitação de compilação e recompilação.

Primeiro de tudo o sql server é baseado em custo,ou seja,no caso uma estatística desatualizada pode gerar um ineficiente plano de execução,pois ele não escolhe a melhor maneira de fazer a ordem dos joins e a melhor estratégia de joins.Se um índice for apagado acidentalmente o sql server vai ter que recompilar o comando e o custo do plano de execução pode sair muito caro.

Na segunda parte desse artigo estarei colocando um comando com DMV que lista as top 10 querys que tem um alto custo de CPU,estarei falando da compilação e recompilação e como achar esses tipos de gargalos usando o system monitor e as DMV.

Abraços e até a próxima.

April 23

BaseLine

Antes de falar sobre o tipos de monitoramento antes,crie um BASELINE,o que seria um baseline?

Baseline é uma maneira de voce montar um “esquema” para monitorar a sua performance,os conceitos são simples e fáceis de aplicar,desde que voce conheça as ferramentas e como utiliza-las da melhor maneira possível.

Primeiro Crie um baseline para monitorar uma performance

Segundo Monitore seu ambiente baseado em seu baseline

Terceiro Detecte o problema,isole o problema  e resolva o problema de performance.

 

Existe muitas rasões para termos problemas de performance,como um índice apagado por acidente.

As ferramentas que podemos utilizar são:

- System Monitor – oferece contadores para monitorar CPU,Disco,Memória e recursos de rede,mas o que isso tem haver com o sql server?O sql server é integrado com o system monitor que oferece excelentes contadores como page life expectancy(Tempo em que as paginas de dados iram permanecer no cache),buffer cachê hit ratio(é a % de acerto que as paginas são buscadas no cache).Tome cuidado na hora de usar o System Monitor,pois  as vezes ele pode causar um overhead dependendo do numero de contadores que voce utilizar.

 - SQL Server Profiler – uma ferramente gráfica para monitorar a instancia do sql server.Voce pode usar o profiler para capturar os dados e salvar em 1 arquivo ou em uma tabela,o ideal é que voce gere em um arquivo,pois voce não gera concorrência no banco de preferência que esse arquivo não fique em nenhum disco usado pelo sql server.o profiler diferente do system monitor o profiler é baseado em evento.Em ambientes pesados é recomendado que use o server-side trace,é uma forma de monitoramente sem interagir com a interface gráfica do profiler,causando menos custo.

Eu vou escrever um artigo falando sobre o server-side trace,que inclusive eu uso para capturar os comandos entre um intervalo de horas,no meu caso das 14:00 as 15:00 da tarde.

 - DTA – Excelente ferramente que analiza os comandos captados pelo profiler e baseado no schema do banco,nos da grandes recomendações de criação de índice por exemplo.

 - Comandos DBCC – eu tenho escutado que esses comandos irão sumir em futuras versões do sql server,que serão substituídos pelas DMV e outros comandos,mas para eu isso é uma lenda..rsrs..Esses comando checam a consistência do banco de dados e nos fornece interesante informações como a fragmentação,statistica de um índice,também nos mostra se o nosso banco de dados esta corrompid o ou não,entre outras informações do banco de dados como DBCC MemoryStatus,DBCC sqlperf(logspace) que nos mostra a porcentagem ocupada no log de transações,de uma pesquisada no books online,são excelentes para monitorar.

 - DMV(Dynamic Management Views) and Functions(DMF) – Foram introduzidas nos sql server 2005 afim de ajudar a monitorar o desempenho,transações e etc..O sql server 2000 era uma caixa preta para monitorar,já no sql server 2005 teve uma grande mudança em questão de monitoramento,ao longo dos meus posts vocês vão se deparar com DIVERSAR DMV,mas para usa-las precisa-se na minha opinião enteder como o sql server funciona internamente como foi mencionado no post anterior.

 

Bom,já que temos em mente as ferramentas necessárias para montar nosso baseline,agora voce se pergunta,qual que vai ser o foco do meu baseline?Simples,vamos focar em 5 assuntos.

*CPU

*Memoria

*I/O

*Tempdb

*Blocking

 

No meu blog vou descrever cada uma delas,vamos partir da primeira.

Amanhã estarei falando sobre a CPU em 2 partes,a primeira será divulgada amanhã e a segunda na sexta-feira.

Abraços e até a próxima...

April 22

Just Tuning.

Pessoal sempre a tempo para mais um post,são 1 hora da manhã eu no momento estou trabalhando..rsrs..massssssss,vamos ao ponto que interessa,primeiro de tudo o que pode impactar a performance?Somente o SQL?NUNCA pense isso,sempre quando temos um problema de performance,temos que olhar o cenário por completo que esta abaixo:

 

1 - Arquitetura da aplicação – envolve como esta nossa arquitetura em camadas,hoje existem ambientes com até 7 camadas por incrível que pareça mas no nosso exemplo vou colocar o dia a dia,sempre olha a primeira camada que é o client,a segunda camada que é a de negócios e a terceira que é o sql server.

 

2 - Design da aplicação – Veja como esta o esquema do seu banco e o desing físico do banco,por exemplo o princiapal é estar nas 5 formas normais,sendo a primeira mais importante é manter o banco consistente e eliminar a redundância de dados.Outro ponto é se possível deixe um disco dedicado somente para o TempDb,futuramente estarei falando sobre isso.

 

3 - Transações e nível de isolamento – saiba o que significa ACID essa sigla define o que é uma transação por completo,verifique os tipos existentes de níveis de isolamento que são Read Commited,Read Uncommited,Repeatable Read e Serializable,pois um dos pontos fortes que pode demonstrar lentidão são os blocks no sql server.

 

4 - Códigos transact-sql – Verifique como que estão escritos os seus códigos transact-sql,já peguei caso de que as vezes em vez a pessoas fazer um update usando um simples comando de update,a pessoa fazia um cursor por exemplo.Sempre verifique o seu código.

 

5 - Recursos de Hardware – Sempre veja como que está a memória,o disco,processador e a rede do seu servidor,veja se as configurações que voce tem hoje,suporta o seu ambiente por completo.

 

6 - Configurações do SQL Server – Veja e estude a sp_configure,pois nesses configurações voce pode fazer uma grande mudança em seu ambiente,pontos fortes que eu falo para CPU,veja affinity mask,Lighweight Pooling,max work threads e max degree of Parallelism.Para memória eu aconselho Max and Min server Memory e o AWE(assunto interessantíssimo).

 

Eu usei esse conteúdo em meu ambiente e tive uma resposta de performance muito boa.

No próximo post estarei falando sobre criar um baseline  para o seu ambiente e sobre as ferramentas que podemos utilizar para cria-lo.

 

Abraços e até a próxima.

April 21

Entendendo o SQL Server

Entendendo o SQL Server.

Pessoal,hoje eu estou com foco em administração do sql server e para administra-lo não basta conhecer somente os comandos ou algo do tipo,a primeiro coisa que temos que entender é procurar saber como que o sql server funciona internamente.Entendendo o modo que ele trabalha fica muito mais fácil montarmos um baseline para solucionar problemas no caso de lentidão no sql server,que pode envolver memória,disco e CPU.

Mas bom voce pensa tenho contadores que posso utilizar para verificar,ok mas e quando a memória esta ok,o disco esta ok e a cpu esta ok,o que fazer?Foi um caso que eu passei e li no blog do Rodrigo Fernandes(http://lobo-fernandes.spaces.live.com/),recomendação do Junior,isso foi o que me incentivou a procurar conhecer o sql server internamente.Existe uma webcast ministrada pelo Luciano Caixeta Moreira no programa da microsoft chamado msdn experience que ele fala no modulo 4 na sessão 1,como o sql server funciona internamente,ele da um foco em alguns processos internos do sql server,como funciona,o que consome CPU,Disco,Memória e uma coisa interessante é uma hora que ele fala: -”Vamos olha o sql server com uma Lupa”.Nesse momento ele mostra como o SQL Server funciona internamente,no caso eu estou començando a estudar forte nesse assunto,somente estou esperando o livro inside sql server 2005 storage engine chegar para conseguir colocar mais assuntos do sql server internamente para vocês =).Então procure saber como o sql server funciona,o que é a Relational engine e quais os componentes dela e o que cada 1 faz,o que é a storage engine,seus componentes e o que cada um faz,e por final o que é o SQLOS,qual seu objetivo,componentes etc...

Na webcast ele mostra como o sql server funciona como um todo,componentes da relational engine,storage engine,sqlos,marry go-round scan,também explicou o que é o lazy writer(Muito importante para identificar um memory botleneck) e etc...

Vale essa dica para vocês,que é o que eu estou usando como base de estudo.

Mas no caso no próximo post estarei colocando o que foi falado nessa webcast resumidamente.

Link do MSDN Experience http://www.msdnbrasil.com.br/experience/sqlserver/Home.aspx

Abraços a todos...

 
Aqui se encontra os sites que eu recomendo de uso meu do dia a dia.