Sto configurando un sistema di monitoraggio per SQL Server utilizzando gli eventi estesi per trovare query pesanti come "feedback sulla produzione" per i nostri sviluppatori. Sto usando gli eventi sp_statement_completed
e sql_statement_completed
, con filtri predicati su cpu_time, letture logiche, ecc. Speravo di aggregare i risultati database_name
e query_hash
come dimostrato in numerosi esempi su Internet, ma nei risultati vedo che query_hash
è 0 per tutte le affermazioni usando EXEC, come nella tabella seguente (timestamp e queryhash abbreviati per leggibilità).
name timestamp query_hash plan_handle statement
sql_statement_completed 2016...6414 0 050056019600764... exec Shared.dbo.SyncFirm
sql_statement_completed 2016...9946 0 06003d00e01e730... exec spSetUserAuth @userid;
sql_statement_completed 2016...7184 0 0600e30028c9da0... exec spSetUserAuth @userid;
sp_statement_completed 2016...0409 9826...578 0600c00028e6aa0... SELECT obfuscated_columns FROM dbo.SomeTable
sp_statement_completed 2016...1448 8660...775 060084006d2d660... INSERT INTO dbo.SomeTable ( obfuscated_columns) EXEC(@sql)
sql_statement_completed 2016...7752 0 0600f9006c23f03... exec spSetUserAuth @userid;
sql_statement_completed 2016...1443 1304...641 06005a0008a9b11... select SUBQ.ontrackstatus, COUNT(SUBQ.ontrac
Tutti i risultati hanno un valore per plan_handle
e sono tutti diversi, quindi vengono generati molti piani. Altre dichiarazioni senza query_hash
(che ho visto) includono ALTER INDEX, CHECKPOINT, AGGIORNAMENTO STATISTICHE, COMMIT TRANSACTION, FETCH NEXT FROM Cursor, alcuni INSERT, SELECT @variable, IF (@variable = x).
Qualcuno sa perché query_hash
è 0? Probabilmente mi manca il punto da qualche parte su SQL Query Analyzer ed EXEC, ma non sono in grado di trovare indizi per indirizzarmi nella giusta direzione. Se i risultati che sto ottenendo sono "normali", come aggregare al meglio i risultati? Il raggruppamento per istruzione non include letterali, spazi bianchi, ecc. Che vengono rimossi quando si calcola query_hash?
EDIT: come lo vedo ora, EXEC SomeStoredProcedure
avvia una procedura memorizzata (ovvia) e le singole istruzioni in quella procedura memorizzata finiscono nella sessione dell'evento come sp_statement_completed
eventi, e tutte hanno una query_hash.
Quindi, per sp_statement_completed
(cioè query "reali"), posso aggregare su query_hash e database_name e, sql_statement_completed
senza query_hash (EXEC SomeStoredProcedure), posso usare il client_connection_id
per raggruppare le istruzioni all'interno di un'esecuzione specifica di una procedura memorizzata, per vedere qual è il più parte costosa della procedura.
query_hash
sia 0, ma per quanto riguarda il motivo per cui leexec spSetUserAuth @userid;
righe hanno diversi handle di piano:The algorithms to match new SQL statements to existing, unused execution plans in the cache require that all object references be fully qualified.
( Origine .) Se tutte quelle voci fossero ad esempioexec dbo.spSetUserAuth @userid;
, potresti ottenere identici handle di piano per loro.