Ajudaria definitivamente a conhecer a versão do SQL Server que você está usando.
Eu considerarei você usar o SQL Server 2005 como é mais comum nos dias de hoje. Para identificar a causa do problema, recomendamos o download do Relatórios do Painel de Desempenho . Depois de instalar os relatórios personalizados e executar o script de implantação conforme detalhado na seção Informações Adicionais da página de download, abra o relatório performance_dashboard_mail.rdl
personalizado no SQL Server Management Studio. A partir daí, há links para relatórios sobre a utilização da CPU que mostram o tempo total consumido por cada consulta em seu sistema. As consultas mais importantes nesses relatórios são as mais propensas a direcionar o sistema para 100% da CPU. Você terá que analisar o plano de execução dessas consultas e identificar por que elas são tão caras. O visualizador de planos do SSMS ajuda muito a isso, basta seguir as linhas thick no plano porque elas representam grandes fluxos de dados. Ao final desses fluxos de dados caros, você provavelmente encontrará operadores de varredura de índice em cluster que retornam todas as linhas da tabela. Você precisará entender a consulta e a estrutura da tabela para decidir por que uma varredura de índice de cluster é escolhida, e você provavelmente terá que decidir sobre a adição de um índice ou dois. O Painel de Desempenho pode ajudar novamente, pois ele tem relatórios que aproveitam as informações esotéricas de sys.dm_db_missing_index_details
e apresentá-lo em um formato de fácil leitura, mais precisamente mostra a declaração CREATE INDEX
sugerida.
Outros recursos de interesse são:
-
sys.dm_exec_query_stats
coleta informações sobre a execução da consulta. as consultas com valores principais emtotal_worker_time
são as que mais consomem CPU. Cruzar, apliquesys.dm_exec_sql_text
para recuperar o texto da consulta. -
sys.dm_exec_procedure_stats
semelhante às estatísticas de consulta, mas para procedimentos. Apenas no SQL Server 2008. -
sys.dm_db_index_usage_stats
coleta informações sobre como as tabelas e índices são acessados. Observe ouser_seeks
,user_scans
,user_lookups
para ver com que frequência e de que maneira a tabela é lida. Vejauser_updates
para ver com que frequência está escrito. -
sys.dm_db_index_operational_stats
coleta informações sobre contenção de acesso a índices, entre outras coisas. Observe as várias colunasxxx_wait_ms
exxx_wait_count
para entender onde ocorre a contenção. Desde que você tem a CPU em 100% é improvável, embora o problema seja contenção, mas eu tenho que apresentar esta informação de qualquer maneira para outros leitores analisando isso.
Com essas investigações concluídas, você deve identificar o problema:
- Verificações de tabela. Isso apareceria como consultas no Painel de Desempenho que são executadas relativamente poucas vezes, mas duram muito tempo a cada execução. Outros sintomas são altos
user_scans
contam comsys.dm_db_index_usage_stats
para índices com muitos registros, grandes números paratotal_physical_reads
emsys.dm_exec_query_stats
. - Table Value Funções que são chamadas com muita frequência na execução. Isso pode ser identificado com
execution_count
muito grande na visualização de estatísticas e nos Painéis de Desempenho. Exemplos típicos são funções para dividir uma cadeia delimitada por vírgula em uma representação relacional (se eu tivesse um centavo para cada vez ...). - Spool e classificação. Não entrarei em detalhes, primeiro faça o dever de casa e investigue os cenários simples acima.
Sucesso!