Pemberitahuan tentang kueri yang berjalan lama atau kebuntuan di SQL Server 2008 R2?

15

Saya ingin tahu apakah ada cara untuk mengirim pemberitahuan di jalan buntu? Jika demikian, pertanyaan apa yang diperlukan. Saya mengerti bahwa SQL Server menangani kebuntuan, saya hanya ingin informasi tentang pertanyaan yang terlibat.

Saya menemukan yang berikut untuk menentukan kueri yang sudah berjalan lama:

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; 

Saya ingin tahu apakah cara di atas adalah cara yang tepat, atau adakah cara yang lebih baik untuk menentukan apakah ada kueri yang membutuhkan waktu lebih lama dari interval tertentu, katakan 5 menit seperti yang ditunjukkan?

Terima kasih

Hasanain
sumber

Jawaban:

8

Dengan SQL 2008 ada fitur baru yang dapat Anda gunakan untuk kebuntuan dan antrian berjalan lama: peristiwa yang diperpanjang . Peristiwa diperpanjang adalah objek tingkat rendah dan mengkonsumsi sumber daya yang jauh lebih sedikit daripada metode lain seperti profiling / pelacakan, peringatan, dll ...

Untuk menggunakan acara yang diperpanjang dengan deadlocksmemeriksa pos ini oleh Jonathan Kehayias , MVP SQL server.

Untuk menggunakan acara yang diperluas untuk menemukan long running queries, lihat pos terperinci ini oleh Pinal Dave , MVP SQL server lain.

StanleyJohns
sumber
10

Anda bisa mengonfigurasi lansiran untuk keduanya dengan SQL Agent. Buat lansiran baru dan pilih jenis "Peringatan kondisi kinerja SQL Server"

Untuk kueri yang berjalan lama, pilih Objek "MSSQL $ InstanceName: Transactions" dan Counter: Time Running Transaksi Terpanjang. Konfigurasikan nilai, dan opsi pemberitahuan lansiran, dan Anda siap melakukannya.

Untuk deadlock, Objeknya adalah "MSSQL $ InstanceName: Locks" dan Counter adalah "Number of Deadlocks / sec"

Jika Anda ingin kontrol notifikasi kebuntuan yang lebih baik, lihat ini: http://www.sqlservercentral.com/articles/Administration/3243/

49
sumber
Saya mencoba mengatur peringatan seperti yang Anda sarankan, namun pekerjaan itu hanya akan berjalan jika saya memiliki langkah-langkah yang ditentukan. Apakah ada cara untuk mengatur peringatan tanpa menentukan langkah-langkah pekerjaan?
Hasanain
4

Saya akan menyukai saran @StanleyJohns jika Anda memiliki SQL2008. Acara yang diperpanjang patut dibiasakan sebagai alat diagnostik dan Jonathon's An XEvent a Day seri adalah tempat yang tepat untuk memulai.

Alternatif untuk kebuntuan adalah mengaktifkan jejak flag 1204 dan 1222 , yang membuang informasi kebuntuan ke log galat SQL. Aktifkan keduanya, sehingga Anda mendapatkan informasi dalam dua format berbeda, yang dapat membuatnya lebih mudah untuk memahami rantai kebuntuan yang kompleks.

Mark Storey-Smith
sumber