SQL Server, işletim sisteminden aldığı belleği kendi içerisinde farklı ihtiyaçlar doğrultusunda alt birimlere ayırır. Bu birimlerin her biri Memory Clerk (Bellek Memuru) olarak adlandırılır. Bir Veritabanı Yöneticisi (DBA) için belleğin sadece “yüzde kaçının” kullanıldığını bilmek yeterli değildir; asıl önemli olan bu belleğin ne amaçla kullanıldığını anlamaktır. Paylaşılan sorgu, sys.dm_os_memory_clerks dinamik yönetim görünümünü (DMV) kullanarak bellek kullanımının röntgenini çekmemizi sağlar.
Aşağıdaki komut yardımıyla görülebilir.
SELECT TOP(10) mc.[type] AS [Memory Clerk Type],
CAST((SUM(mc.pages_kb)/1024.0) AS DECIMAL (15,2)) AS [Memory Usage (MB)]
FROM sys.dm_os_memory_clerks AS mc WITH (NOLOCK)
GROUP BY mc.[type]
ORDER BY SUM(mc.pages_kb) DESC OPTION (RECOMPILE);
Test ortamında alınan ekran resmi:

Yukarıdaki tablodan hiyerarşik olarak şu sonuçları çıkarabiliriz:
- MEMORYCLERK_SQLBUFFERPOOL: SQL Server’ın kalbidir. Veri sayfalarının (Data Pages) RAM’de tutulduğu yerdir. Diskten okunan veriler buraya yazılır.
- CACHESTORE_SQLCP: “SQL Plans” demektir. Yazdığınız sorguların (ad-hoc sorgular) derlenmiş planları burada saklanır.
- CACHESTORE_OBJCP: Saklı yordamlar (Stored Procedures) ve fonksiyonlar gibi nesnelerin planlarını tutar.
- MEMORYCLERK_SOSNODE: SQL Server’ın kendi iç işleyişi, thread yönetimi ve zamanlayıcıları (scheduler) için kullandığı bellektir.
- MEMORYCLERK_SQLCLR: Eğer veritabanında .NET kodları (CLR) çalıştırıyorsanız, bu kalemdeki kullanım artar.
- MEMORYCLERK_SQLLOGPOOL: İşlem günlüklerinin (Transaction Log) yönetimi için ayrılan önbellektir.
İdeal ve sağlıklı bir SQL Server ortamında MEMORYCLERK_SQLBUFFERPOOL her zaman listenin bir numarasında olmalıdır.
- Çünkü SQL Server’ın asıl amacı veriyi işlemektir. Veri sayfaları ne kadar çok RAM’de (Buffer Pool) kalırsa, sunucu diske o kadar az gider ve performans o kadar artar.
- Genellikle toplam SQL kullanımının %70-%80 ve üzeri bu alana ait olmalıdır.
Sonuçlarda aşağıdaki durumları görüyorsanız bir optimizasyon sorunu var demektir:
- CACHESTORE_SQLCP Çok Yüksekse: Eğer bu değer Buffer Pool’a yaklaşıyorsa, sunucunuz “Ad-hoc” sorgu çöplüğüne dönmüş demektir. Yani her gelen sorgu parametre kullanılmadan (yeni bir sorgu gibi) gönderiliyor ve RAM’i veri tutmak yerine “plan tutmak” için harcıyorsunuz. Optimize for Ad hoc Workloads ayarını aktif etmeyi düşünebilirsiniz.
- MEMORYCLERK_SQLGENERAL Sürekli Artıyorsa: Genellikle çok büyük kilitler (Locking) veya genel yönetimsel yüklerin arttığını gösterir.
- USERSTORE_TOKENPERM Yüksekse: Güvenlik kontrolleri ve izinlerin (permissions) çok sık sorgulandığını gösterir; bazen bir bug veya yetkilendirme mimarisindeki hataya işaret eder.
Başka makalede görüşmek dileğiyle…
“Öyle ise emrolunduğun gibi dosdoğru ol.” Hud-112
