it-swarm.asia

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

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

15
Hasanain

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

Untuk menggunakan acara yang diperluas dengan deadlocks lihat ini dikirim oleh Jonathan Kehayias , MVP SQL server.

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

8
StanleyJohns

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, periksa ini: http://www.sqlservercentral.com/articles/Administration/3243/

10
FortyNine

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

Alternatif untuk deadlock adalah aktifkan flag jejak 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.

4