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


15

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; 

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

Grazie

Risposte:


8

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 deadlocksquesto post di Jonathan Kehayias , un MVP di SQL Server.

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


10

È 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/


Ho tentato di impostare l'avviso come da te suggerito, tuttavia il lavoro verrà eseguito solo se sono stati definiti i passaggi. C'è un modo per impostare l'avviso senza definire le fasi del lavoro?
Hasanain,

4

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

Un'alternativa per 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 diversi formati, che possono semplificare la comprensione di catene di deadlock complesse.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.