it-swarm.it

Notifica su query o deadlock a esecuzione prolungata in SQL Server 2008 R2?

Vorrei sapere se esiste un modo per inviare una notifica in deadlock? In tal caso quali domande sarebbero richieste. Comprendo che SQL Server si occupa dei deadlock, vorrei semplicemente informazioni sulle query coinvolte.

Ho trovato quanto segue per determinare le query di lunga durata:

SELECT 
    creation_time
    ,last_execution_time
    ,total_physical_reads
    ,total_logical_reads
    ,total_logical_writes
    , execution_count
    , total_worker_time
    , total_elapsed_time
    , total_elapsed_time / execution_count avg_elapsed_time
    ,SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
    ((CASE statement_end_offset
        WHEN -1 THEN DATALENGTH(st.text)
        ELSE qs.statement_end_offset END
    - qs.statement_start_offset)/2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS qs
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st  
where total_elapsed_time >= 300000000 --5 min
ORDER BY total_elapsed_time / execution_count DESC; 

Vorrei sapere se quanto sopra è la strada giusta da percorrere, oppure esiste un modo migliore per determinare se una query impiega più tempo di un intervallo specifico, ad esempio 5 minuti, come mostrato?

Grazie

15
Hasanain

Con SQL 2008 è disponibile una nuova funzionalità che è possibile utilizzare per deadlock e code di lunga durata: eventi estesi . Gli eventi estesi sono oggetti di basso livello e consumano risorse molto inferiori rispetto ad altri metodi come profilazione/tracciamento, avvisi, ecc ...

Per l'utilizzo di eventi estesi con deadlocks controlla questo post di Jonathan Kehayias , un MVP di SQL Server.

Per l'utilizzo di eventi estesi per trovare long running queries, dai un'occhiata a questo dettagliato post di Pinal Dave , un altro MVP di SQL Server.

8
StanleyJohns

È possibile configurare avvisi per entrambi con SQL Agent. Creare un nuovo avviso e selezionare il tipo "Avviso relativo alle condizioni delle prestazioni di SQL Server"

Per query a esecuzione prolungata, selezionare Oggetto "MSSQL $ Nome_istanza: Transazioni" e Contatore: Tempo di esecuzione della transazione più lungo. Configura i valori e le opzioni di notifica degli avvisi e sei a posto.

Per deadlock, l'oggetto è "MSSQL $ InstanceName: Locks" e il contatore è "Numero di deadlock/sec"

Se si desidera un controllo più approfondito della notifica di deadlock, consultare questo: http://www.sqlservercentral.com/articles/Administration/3243/

10
FortyNine

Preferirei il suggerimento di @StanleyJohns se si dispone di SQL2008. Vale la pena familiarizzare con eventi estesi come strumento diagnostico e la serie An XEvent a Day di Jonathon è un ottimo punto di partenza.

Un'alternativa per i deadlock è abilitare i flag di traccia 1204 e 1222 , che scaricano le informazioni sui deadlock nel registro errori SQL. Abilitare entrambi, in modo da ottenere le informazioni in due formati diversi, che possono semplificare la comprensione di catene di deadlock complesse.

4