SQL Server yöneticileri (DBA) için en büyük zorluklardan biri, sunucudaki performans darboğazlarını tespit etmektir. Sunucuda CPU kullanımı %90’lara dayandığında, asıl soru şudur: “Hangi veritabanı bu yükü oluşturuyor?”
Bu makalede, sys.dm_exec_query_stats Dinamik Yönetim Görünümünü (DMV) kullanarak veritabanlarının CPU tüketim oranlarını nasıl analiz edeceğimizi inceleyeceğiz.
Aşağıdaki sorgu, SQL Server’ın plan önbelleğinde (plan cache) bulunan tüm sorgu istatistiklerini tarar. Bu istatistikleri, her bir sorgunun ait olduğu veritabanı kimliği (dbid) ile ilişkilendirir ve toplam çalışma süresini (total_worker_time) hesaplar.
WITH DB_CPU_Stats
AS
(SELECT DatabaseID, DB_Name(DatabaseID) AS [DatabaseName], SUM(total_worker_time) AS [CPU_Time_Ms]
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY (SELECT CONVERT(int, value) AS [DatabaseID]
FROM sys.dm_exec_plan_attributes(qs.plan_handle)
WHERE attribute = N'dbid') AS F_DB
GROUP BY DatabaseID)
SELECT ROW_NUMBER() OVER(ORDER BY [CPU_Time_Ms] DESC) AS [row_num],
DatabaseName, [CPU_Time_Ms]/1000 as [CPU_Time_Sec],
CAST([CPU_Time_Ms] * 1.0 / SUM([CPU_Time_Ms]) OVER() * 100.0 AS DECIMAL(5, 2)) AS [CPUPercent]
FROM DB_CPU_Stats
WHERE DatabaseID > 4 -- system databases
AND DatabaseID <> 32767 -- ResourceDB
ORDER BY row_num OPTION (RECOMPILE);
go

- sys.dm_exec_query_stats: SQL Server’ın belleğinde tutulan sorgu performans verilerini sağlar.
- CROSS APPLY & sys.dm_exec_plan_attributes: Her bir sorgu planının hangi veritabanına ait olduğunu bulmak için kullanılır. Çünkü query_stats doğrudan veritabanı adını içermez.
- total_worker_time: Sorguların CPU üzerinde harcadığı toplam süreyi mikrosaniye cinsinden verir.
- Window Functions (SUM OVER): Tüm veritabanlarının toplam CPU süresini hesaplayarak, her bir veritabanının genel sistem içindeki % (yüzdelik) payını bulmamızı sağlar.
Sorgu sonucunda elde edilen tablo (görseldeki gibi), kaynak yönetimi için kritik bilgiler sunar:
- row_num 1: Listenin en başında yer alan veritabanı, sistemdeki “Hot Spot” yani en yoğun işlem yapılan noktadır. Görseldeki örnekte ilk sıradaki veritabanı %64.51 pay ile açık ara liderdir.
- CPUPercent: Bu kolon, sunucu kapasitesinin veritabanları arasındaki dağılımını gösterir. Eğer bir veritabanı %50’nin üzerindeyse, o veritabanındaki sorguların (Index eksikliği, kötü yazılmış Query’ler vb.) optimize edilmesi gerekir.
Bu veriler Plan Önbelleği (Plan Cache) üzerinden okunur. Eğer SQL Server servisi yeni yeniden başlatıldıysa veya plan önbelleği temizlendiyse (DBCC FREEPROCCACHE), bu sonuçlar sadece son temizlikten itibaren olan verileri gösterecektir.
Bu yöntem, “Sunucu neden yavaş?” sorusuna veritabanı düzeyinde hızlı bir yanıt verir. Bir sonraki adımda, en yüksek yüzdeye sahip veritabanına odaklanarak o veritabanındaki en maliyetli sorguları (Expensive Queries) analiz etmek, performans iyileştirme sürecinin temelini oluşturur.
Başka makalede görüşmek dileğiyle..
İsraf etmeyin. İsra-26
