MSSQL Server’da Memory ve CPU Üzerinde En Çok Kaynak Tüketen Stored Procedure’lerin Tespiti

Veritabanı performans optimizasyonu süreçlerinde, sistem kaynaklarını en çok tüketen unsurların belirlenmesi ilk adımdır. İncelenen SQL sorgusu, sys.dm_exec_procedure_stats dinamik yönetim görünümünü (DMV) kullanarak, bellek ve CPU üzerinde en fazla yük oluşturan saklı yordamları analiz etmektedir.

Bu sorgunun birincil hedefi, I/O yoğunluğunu ölçmektir. SQL Server’da bir veriye her erişildiğinde bu “mantıksal okuma” olarak kaydedilir. total_logical_reads değeri ne kadar yüksekse, ilgili prosedür o kadar fazla veriyi bellekten (Buffer Pool) talep ediyor demektir. Bu durum genellikle eksik indekslerin veya verimsiz yazılmış sorguların habercisidir.

SELECT  TOP(25)
p.name AS [SP Name],
qs.total_logical_reads AS [TotalLogicalReads],
qs.total_logical_reads/qs.execution_count AS [AvgLogicalReads],
qs.execution_count AS 'execution_count',
qs.total_elapsed_time AS 'total_elapsed_time',
qs.total_elapsed_time/qs.execution_count AS 'avg_elapsed_time',
qs.cached_time AS 'cached_time'
FROM sys.procedures AS p
INNER JOIN sys.dm_exec_procedure_stats AS qs 
ON p.[object_id] = qs.[object_id]
WHERE
qs.database_id = DB_ID()
ORDER BY
qs.total_logical_reads DESC;

Sorguda kullanılan sütunlar ve işlevleri şu şekildedir:

  • p.name: İstatistikleri incelenen procedürün adını belirtir.
  • total_logical_reads: Prosedürün önbelleğe alındığından beri yaptığı toplam okuma sayısıdır. Toplam yükü gösterir.
  • AvgLogicalReads: Toplam okuma sayısının çalışma sayısına bölünmesiyle elde edilir. Bu değer, prosedürün her bir çalışmada ne kadar maliyetli olduğunu gösterir.
  • execution_count: Prosedürün kaç kez tetiklendiğini ifade eder. Az çalışan ama çok yük getiren veya sık çalışan ve toplamda yük oluşturan işlemlerin ayrımını yapmamızı sağlar.
  • total_elapsed_time: Prosedürün toplam çalışma süresini (mikrosaniye cinsinden) gösterir.
  • cached_time: Prosedürün ne zaman derlenip önbelleğe alındığını gösterir. Analizin hangi zaman dilimini kapsadığını anlamak için kritiktir.

Sorgu sonucunda listenin başında yer alan prosedürler için şu adımlar izlenmelidir:

  • Yüksek AvgLogicalReads: Eğer bir prosedür her çalışmasında çok fazla okuma yapıyorsa, sorgu planı incelenmeli ve eksik indeksler (Missing Indexes) eklenmelidir.
  • Yüksek Execution Count: Çok sık çalışan prosedürler, küçük iyileştirmelerle bile (örneğin; SELECT * yerine sadece gerekli sütunları seçmek) toplam sistem yükünde büyük rahatlama sağlayabilir.
  • Zaman Farkı: total_elapsed_time yüksek ancak okuma sayısı düşükse, bu durum kilitleme (blocking) veya network gecikmelerine işaret edebilir.

Bu SQL sorgusu, veritabanı sağlığını korumak için periyodik olarak çalıştırılması gereken bir teşhis aracıdır. Bellek yönetimini optimize etmek ve disk üzerindeki baskıyı azaltmak isteyen yöneticiler için en doğru başlangıç noktasını sunar.

Başka makalede görüşmek dileğiyle..

Boş konuşmalardan kaçının Müminin-3

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir