it-swarm.com.de

Benachrichtigung bei lang laufender Abfrage oder Deadlock in SQL Server 2008 R2?

Ich möchte wissen, ob es eine Möglichkeit gibt, eine Benachrichtigung bei Deadlock zu senden. Wenn ja, welche Abfragen wären erforderlich? Ich verstehe, dass SQL Server sich um Deadlocks kümmert. Ich möchte einfach Informationen zu den beteiligten 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 würde gerne 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, z. B. 5 Minuten, wie gezeigt?

Vielen Dank

15
Hasanain

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 mit deadlocks finden Sie in diesem Beitrag von Jonathan Kehayias , einem SQL Server-MVP.

Für die Verwendung erweiterter Ereignisse zum Auffinden von long running queries, lesen Sie diesen detaillierten Beitrag von Pinal Dave , einem anderen SQL Server-MVP.

8
StanleyJohns

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

Wählen Sie für Abfragen mit langer Laufzeit das Objekt "MSSQL $ InstanceName: Transactions" und Counter: Longest Transaction Running Time. Konfigurieren Sie die Werte und die Benachrichtigungsoptionen für Warnungen, und Sie können loslegen.

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

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

10
FortyNine

Ich würde @ StanleyJohns Vorschlag bevorzugen, wenn Sie SQL2008 haben. Es lohnt sich, sich mit erweiterten Ereignissen als Diagnosewerkzeug vertraut zu machen, und Jonathons An XEvent a Day -Serie ist ein guter Anfang.

Eine Alternative für Deadlocks ist Trace-Flags 1204 und 1222 aktivieren , die Deadlock-Informationen in das SQL-Fehlerprotokoll speichern. Aktivieren Sie beide, damit Sie die Informationen in zwei verschiedenen Formaten erhalten, was das Verständnis komplexer Deadlock-Ketten erleichtert.

4