- #1
Konu Sahibi
: serkankacan
[YÖNETİCİ REHBERİ] SQL Server'da Çalıştırılan Son 1.000 Sorguyu (Query) Görme
sys.dm_exec_query_stats Üzerinden Veritabanında Yürütülen Son Sorguları, Çalışma Zamanlarını ve Detayları Listeleme
sys.dm_exec_query_stats Üzerinden Veritabanında Yürütülen Son Sorguları, Çalışma Zamanlarını ve Detayları Listeleme
Merhaba değerli forum sakinleri,
Silkroad Online sunucu yönetiminde veritabanında az önce hangi sorguların çalıştırıldığını görmek, web panellerinden/botlardan gelen işlemleri takip etmek veya anlık veritabanı kasmalarının (CPU spike / Lag) hangi SQL sorgusundan kaynaklandığını tespit etmek için SQL Server'ın dinamik yönetim görünümlerinden (DMV) faydalanırız.
Eski paylaşımlardaki
sys.syscacheobjects görünümü sorgu zamanını göstermez ve sıralamayı kullanım sıklığına göre yapar. Aşağıda paylaşılan optimize sistem; sorgunun **tam çalışma tarihini/saatini**, **hangi veritabanında çalıştığını** ve **son yürütülen 1.000 sorguyu** eksiksiz listeler.Teknik Bilgilendirme' Alıntı:
- Plan Cache Hafızası: Bu sorgular SQL Server'ın önbelleğinde (Plan Cache) tutulan verileri okur. SQL Server servisi yeniden başlatılırsa veya önbellek temizlenirse sayaçlar sıfırdan başlar.
- last_execution_time: İlgili sorgunun en son tam olarak hangi gün, saat, dakika ve saniyede yürütüldüğünü belirtir.
1. YÖNTEM: En Son Çalıştırılan 1.000 Sorgu (Zamana Göre - ÖNERİLEN)
Veritabanında yürütülmüş olan en güncel sorguları kronolojik sırayla (en yeniden eskiye) listelemek için:
SQL:
-- ===================================================================
-- EN SON ÇALIŞTIRILAN 1.000 SORGUYU LİSTELEME
-- ===================================================================
SELECT TOP (1000)
QS.last_execution_time AS [Son Calistirilma Zamani],
DB_NAME(ST.dbid) AS [Veritabani],
SUBSTRING(
ST.text,
(QS.statement_start_offset / 2) + 1,
((CASE QS.statement_end_offset
WHEN -1 THEN DATALENGTH(ST.text)
ELSE QS.statement_end_offset
END - QS.statement_start_offset) / 2) + 1
) AS [Calistirilan Asil Sorgu],
ST.text AS [Tum Batch / Prosedur Metni],
QS.execution_count AS [Toplam Calisma Sayisi],
(QS.total_worker_time / 1000) AS [Toplam Harcanan CPU (ms)],
QS.total_logical_reads AS [Toplam Okuma (Disk/RAM)]
FROM sys.dm_exec_query_stats QS WITH (NOLOCK)
CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) ST
ORDER BY QS.last_execution_time DESC
2. YÖNTEM: En Çok Çalıştırılan / Sunucuyu En Çok Yoran Sorgular
Eğer sunucunuzda en çok tekrar eden ve CPU yükü oluşturan sorguları (Loop, bot veya optimizasyonsuz sorgular) bulmak isterseniz:
SQL:
-- ===================================================================
-- EN SIK KULLANILAN VE EN YÜKSEK ÇALIŞMA SAYISINA SAHİP SORGULAR
-- ===================================================================
SELECT TOP (1000)
QS.execution_count AS [Calistirilma Sayisi],
QS.last_execution_time AS [Son Calisma Tarihi],
DB_NAME(ST.dbid) AS [Veritabani],
ST.text AS [Sorgu Metni],
(QS.total_worker_time / QS.execution_count) / 1000 AS [Ortalama CPU Suresi (ms)]
FROM sys.dm_exec_query_stats QS WITH (NOLOCK)
CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) ST
ORDER BY QS.execution_count DESC
Nasıl Uygulanır?
- SQL Server Management Studio (SSMS) programını açın.
- Herhangi bir veritabanını seçmenize gerek yoktur (Sistem seviyesinde çalışır); üst menüden New Query butonuna tıklayın.
- Yukarıdaki 1. Yöntem kodunu yapıştırın.
TOP (1000)kısmındaki rakamı ihtiyacınıza göre (Örn:100veya500) değiştirebilirsiniz.- F5 tuşuna basarak çalıştırın.
- Alt panelde veritabanınızda yürütülmüş tüm sorgular son çalışma tarihine göre listelenecektir.
Sorularınızı ve takıldığınız yerleri bu konu altından paylaşabilirsiniz. Herkese keyifli ve güvenli yönetimler!

