Bugünkü yazımda sizlere SQL Server üzerinde ağırlık yaratan sorguların nasıl tespit edildiği hakkında yardımcı olmaya çalışacağım. Elimin altında her zaman bu sorguyu bulundururum ve çok işime yarar.
Uzun süreli çalışan ve sistemi yoran sorguları net bir şekilde yakalayabiliriz.
Aşağıdaki sorguyu çalıştırdığınızda sistem üzerinde anlık oluşan işlemlerin listesini alarak yoğunluk yaratan sorgularda total_elapset_time değeri ve cpu_time değeri yüksek olan sorgular tespit edilerek session_ id belirlenip kill edilmesi ile sistemdeki ağırlık kontrol altına alınmış olur.
kill [session_id] bu şekilde ilgili session yani sorgu kill edilmiş olur.
Uygulamış olduğumuz sorgu sonucunda aşağıdaki başlıklarda sonuçlar görürüz.. Bu başlıkları kısaca açıklayayım.
Status Kolonunda
Suspended : Askıya alınan sesison
Mevcut olmayan bir kaynağa erişim talep edildiğinden bir sorgu askıya alınır. Kaynak kullanıma sunulduğunda sorgu yeniden çalışmaya başlar.
Running : Çalışan sorgular
Sistemde anlık olarak çalışan tüm sorgular
Yüksek disk IO, isteği yerine getirmek için çok fazla veri sayfasına erişilmesi gerektiği anlamına gelir.
Wait Type Kolonunda
wait_type : ASYNC_NETWORK_IO
Verinin SQL Server üzerinden Client’a giderken beklemesi sırasında oluşur. Eğer Client SQL Server’ın veriyi verdiği hızdan daha yavaş işliyorsa ya da network bandwith’i yetmiyorsa ya da büyük veri aktarımı yapılıyorsa oluşabilir.
wait type : PAGEIOLATCH_EX
I\O isteğinde bulunan bir görevin ara bellekte oluşan latch’i beklemesiyle oluşur. Oluşan latch Exclusive modundadır. Uzun süreli beklemeler disk alt sisteminde sorun olduğunu gösterebilir.
wait type : PAGEIOLATCH_SH
I\O isteğinde bulunan bir görevin ara bellekte oluşan latch’i beklemesiyle oluşur. Oluşan latch Shared modundadır. Uzun süreli beklemeler disk alt sisteminde sorun olduğunu gösterebilir.
SELECT sqltext. TEXT,req .total_elapsed_time,
req.session_id ,
req.start_time ,
req.status ,
req.wait_type ,
req.cpu_time ,
req.blocking_session_id ,
ses.*
--,req.*
FROM sys .dm_exec_sessions ses ,sys. dm_exec_requests req
CROSS APPLY sys. dm_exec_sql_text(sql_handle ) AS sqltext
where ses. session_id = req .session_id
--where req.total_elapsed_time > 5000
order by req.total_elapsed_time desc