Estou analisando uma instância de 2008 que oferece suporte a um aplicativo de terceiros.
O aplicativo gerará o código SQL e o enviará ao banco de dados como uma consulta ad-hoc.
Estou usando esta consulta (com base em um script Glenn Berry):
SELECT
qs.creation_time
,qs.last_execution_time
,qs.execution_count
,qs.total_worker_time
,qs.total_physical_reads
,qs.total_logical_writes
,qs.total_logical_reads
,qs.plan_handle
,qt.text
,qt.dbid
FROM
sys.dm_exec_query_stats AS qs WITH (NOLOCK)
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
WHERE
qt.dbid >= 7
OPTION (RECOMPILE)
Meu problema é que estou recebendo milhares de planos para consultas muito semelhantes, ou seja,
SELECT * FROM customers WHERE name = 'bob'
SELECT * FROM customers WHERE name = 'bill'
(na realidade as consultas são muito grandes e até 3000 caracteres)
Está tornando quase impossível obter os dados em um formato ideal para análise de alto nível.
É possível comparar rapidamente 2 consultas SQL e ver se elas são praticamente a mesma consulta? Eu então escolheria uma das consultas aleatoriamente e agruparia toda a atividade em relação a essa consulta. (Eu tentei DIFERENÇA, mas é muito lento)
O SQL já armazena um valor semelhante ao MD5 Hash sql_handle que permite ver se duas consultas são semelhantes e consequentemente reutilizar o mesmo plano? (Se esse valor existir, eu o agruparia)
Não tenho esse problema com Stored Procedures porque o mesmo plano está sendo reutilizado. São apenas todos os ad-hocs semelhantes que quero agrupar.
O que você está procurando é a coluna
query_hash
, que foi introduzida no SQL Server 2008 . Você pode encontrar isso emsys.dm_exec_query_stats
. Aqui está um exemplo de consulta para analisar os 20 padrões mais comuns:Outra coluna relacionada é
query_plan_hash
, que é útil para ver planos de execução semelhantes.