Depois de ler os blogs a seguir, entendo que as hash match
causas agregadas blocking
. Usando índices apropriados, pode ser feito como stream aggregate
.
- Operadores agregados bloqueadores/não bloqueadores
- A natureza bloqueadora dos agregados - Rob Farley
- Hash Aggregate-Craig Freedman
Eu tenho um banco de dados com mais de 200 tabelas que foram criadas anos atrás. Estou tentando encontrar todas as consultas com group by que estão trabalhando atualmente com hash match
o operador agregado. Uma possibilidade que encontrei é usar dmv como abaixo. Mas não sei como filtrá-lo para listar apenas consultas com hash match
operadores agregados. Como conseguir isso? Além disso, em um nível geral, quais são as outras opções para obter essas informações além de seguir o dmv?
SELECT cp.objtype AS ObjectType,
OBJECT_NAME(st.objectid,st.dbid) AS ObjectName,
cp.usecounts AS ExecutionCount,
st.TEXT AS QueryText,
qp.query_plan AS QueryPlan
FROM sys.dm_exec_cached_plans AS cp
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st
WHERE st.TEXT LIKE '%GROUP%'
Não é possível conectar diretamente parte do texto da consulta (por exemplo
GROUP BY
, ) com uma operação específica no plano de execução final.Você pode escrever uma consulta para encontrar planos que:
GROUP BY
cláusula... o que não é exatamente a mesma coisa, pois isso encontrará planos em que a lógica de agrupamento foi implementada usando um Stream Aggregate, substituído por outra operação ou até mesmo removido totalmente - mas também contém um Hash Match Aggregate por algum outro motivo .
Por exemplo:
Isso pode perder algumas
GROUP BY
consultas se elas tiverem uma quantidade (ou tipo) diferente de espaço em branco entreGROUP
eBY
do que o esperado pela consulta. Talvez substituir todos os espaços em branco por espaços e recolher os contíguos em um único espaço possa ser feito antesLIKE
ou usar SQLCLR e regex.Você precisaria inspecionar os resultados manualmente para determinar se o Hash Match Aggregate se correlaciona diretamente com a
GROUP BY
cláusula ou não. A consulta acima poderia ser estendida, talvez, para verificar o elemento HashKeysBuild do plano em relação às colunas de agrupamento, mas isso seria difícil de acertar devido às operações do otimizador.