Como acompanhamento da minha pergunta anterior sobre solução de problemas de perf em um site do Sharepoint , gostaria de saber se poderia fazer algo sobre as esperas do CXPACKET.
Eu sei que a solução instintiva é desligar todo o paralelismo definindo MAXDOP como 1 - parece uma má ideia. Mas outra ideia é aumentar o limite de custo antes que o paralelismo entre em ação. O padrão de 5 para o custo de um plano de execução é razoavelmente baixo.
Então, eu queria saber se há uma consulta já escrita que encontraria as consultas com o maior custo do plano de execução (eu sei que você pode encontrar aquelas com a maior duração de execução e assim por diante - mas o custo do plano de execução pode ser recuperado em algum lugar, também?) e isso também me diria se tal consulta foi executada em paralelo.
Alguém tem esse script em mãos ou pode me indicar a direção do DMV, DMF ou outras exibições de catálogo do sistema relevantes para descobrir isso?
CXPACKET
nunca é uma causa; leva toda a culpa, mas é sempre um sintoma de outra coisa. Você precisa pegar essas perguntas no ato e descobrir o que é "algo mais". Pode ser diferente de consulta para consulta, e desligar completamente o paralelismo é - como você sugeriu - um exagero desnecessário na maioria dos casos. Mas geralmente é a menor quantidade de trabalho, e é por isso que é um "conserto" tão comum.Se você puder obter um plano real para uma consulta que parece ser responsável por altas esperas de CXPACKET, carregue-o no SentryOne Plan Explorer . Geralmente há uma razão por trás disso; mostramos quais operações paralelas levaram à distorção de encadeamento e você pode facilmente correlacionar isso com estimativas que estão erradas (destacamos operações com estimativas que estão erradas em pelo menos um determinado limite). Normalmente, o problema subjacente são estatísticas muito ruins/desatualizadas (ou indisponíveis).
Infelizmente, o que você encontrará em sys.dm_exec_cached_plans são planos estimados . Eles não dirão se o plano foi paralelo quando foi realmente usado, porque o plano real não é o que está armazenado em cache. Em alguns casos, você espera ver um plano serial e paralelo para a mesma consulta; não é assim que o SQL Server lida com a situação de planos paralelos que podem ser paralelos em tempo de execução. ( Muitas informações sobre isso aqui .)
Se você deseja ver o plano de execução real de uma consulta em execução.
Primeiro insira o resultado nesta consulta.
Isso mostrará o plano de execução real que o sql usou para essa consulta. Você pode usar esse plano de execução para ver qual thread está esperando.
Também descobri que desativar o hyper threading reduziu drasticamente meus tempos de espera do CXpacket.
Espero que ajude.
A resposta acima de Aaron está correta.
Gostaria apenas de acrescentar que, se você ainda não estiver usando o SQL Performance Dashboard Reports e o Data Collector integrado , você deve começar.
Você também pode pegar a seguinte consulta e modificá-la como achar melhor:
Em minha experiência anterior, o limite de custo para paralelismo não ajudou a reduzir o CXPACKET.
A espera alta
CXPACKET
pode ocorrer devido a estatísticas incorretas, resultando em paralelismo distorcido.A seguir está o SQL que usei para encontrar sessões que possuem CXPacket e " outras esperas " (consulte o diagrama abaixo).
SQL
Varreduras grandes também podem ser parte da causa raiz. Quando verifiquei o plano de execução da consulta acima, encontrei uma dessas varreduras em meu banco de dados. Havia também uma sugestão de índice ausente no plano de execução.