Benachrichtigung bei längerer Abfrage oder Deadlock in SQL Server 2008 R2?


15

Ich möchte wissen, ob es eine Möglichkeit gibt, bei einem Deadlock eine Benachrichtigung zu senden. Wenn ja, welche Abfragen wären erforderlich? Ich verstehe, dass sich SQL Server um Deadlocks kümmert. Ich hätte einfach gerne Informationen zu den betreffenden Abfragen.

Ich habe Folgendes gefunden, um lang laufende Abfragen zu ermitteln:

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; 

Ich möchte wissen, ob das oben Genannte der richtige Weg ist, oder gibt es einen besseren Weg, um festzustellen, ob eine Abfrage länger dauert als ein bestimmtes Intervall, beispielsweise 5 Minuten, wie gezeigt?

Vielen Dank

Antworten:


8

Mit SQL 2008 gibt es eine neue Funktion, die Sie für Deadlocks und lange laufende Warteschlangen verwenden können: erweiterte Ereignisse . Erweiterte Ereignisse sind Objekte auf niedriger Ebene und verbrauchen viel weniger Ressourcen als andere Methoden wie Profilerstellung / Ablaufverfolgung, Warnungen usw.

Informationen zur Verwendung erweiterter Ereignisse finden deadlocksSie in diesem Beitrag von Jonathan Kehayias , einem SQL Server-MVP.

In long running queriesdiesem ausführlichen Beitrag von Pinal Dave , einem anderen SQL Server-MVP , finden Sie Informationen zur Verwendung erweiterter Ereignisse .


10

Sie können Alerts für beide mit SQL Agent konfigurieren. Erstellen Sie eine neue Warnung und wählen Sie den Typ "SQL Server-Leistungsbedingungswarnung" aus.

Wählen Sie für lange laufende Abfragen Objekt "MSSQL $ InstanceName: Transactions" und Indikator: Längste Transaktionslaufzeit. Konfigurieren Sie die Werte und die Benachrichtigungsoptionen, und Sie können loslegen.

Für Deadlocks lautet das Objekt "MSSQL $ InstanceName: Locks" und der Zähler lautet "Number of Deadlocks / sec".

Wenn Sie die Deadlock-Benachrichtigung genauer steuern möchten, lesen Sie Folgendes: http://www.sqlservercentral.com/articles/Administration/3243/


Ich habe versucht, die Warnung wie von Ihnen vorgeschlagen einzurichten. Der Job wird jedoch nur ausgeführt, wenn Schritte definiert wurden. Gibt es eine Möglichkeit, die Warnung einzurichten, ohne Jobschritte zu definieren?
Hasanain

4

Ich würde @ StanleyJohns Vorschlag bevorzugen, wenn Sie SQL2008 haben. Erweiterte Veranstaltungen sind es wert, sich mit einem Diagnosetool vertraut zu machen, und Jonathons An XEvent a Day- Reihe ist ein großartiger Ausgangspunkt.

Eine Alternative für Deadlocks besteht darin, die Ablaufverfolgungsflags 1204 und 1222 zu aktivieren , mit denen Deadlock-Informationen in das SQL-Fehlerprotokoll geschrieben werden. Aktivieren Sie beide, damit Sie die Informationen in zwei unterschiedlichen Formaten erhalten, wodurch es einfacher wird, komplexe Deadlock-Ketten zu verstehen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.