DBCC FREEPROCCACHE ve DBCC DROPCLEANBUFFERS, SQL Server’da kullanılan iki sistem komutudur. Performans testleri sırasında veya sorgu planlarını temizlemek amacıyla kullanılan bu komutlar, dikkatli kullanılmalıdır çünkü çalışma ortamında yanlış kullanım ciddi performans sorunlarına neden olabilir.
1. DBCC FREEPROCCACHE
Bu komut, SQL Server’ın sorgu planı önbelleğini temizler. Bu, tüm önbelleğe alınmış yürütme planlarının silinmesi anlamına gelir. Genellikle sorgu planlarının yeniden oluşturulmasını test etmek için kullanılır. Memory’de kayıtlı bir execution plan olmadığın için sorgu yeniden compile olmak zorundadır.
Kullanım:
DBCC FREEPROCCACHE;
Kullanıldığında, SQL Server tüm mevcut sorgu planlarını kaldırır. Özellikle performans testleri sırasında faydalıdır. Üretim ortamında çalıştırılması önerilmez, çünkü planların yeniden oluşturulması CPU kullanımını artırabilir.
Belirli bir sorgu planını temizlemek için:
DBCC FREEPROCCACHE(plan_handle);
Burada plan_handle, temizlenmek istenen sorgu planının kimliğidir.
Aşağıdaki komut yardımıyla sorgumuzun plan handle değerini bulabiliriz.
USE AdventureWorks2014;
SELECT plan_handle,cp.usecounts,cp.objtype, st.text,DB_NAME(st.dbid) as [Database Name]
FROM sys.dm_exec_cached_plans as cp
CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st
WHERE text LIKE N'SELECT * FROM Person.Person%' OPTION (RECOMPILE);

Yukarıdaki kodumuzu ve dönen ifadeleri açıklamak gerekirse;
Hangi veritabanı üzerinde çalışacaksak ilgili veritabanının seçilmesi gerekmektedir.
plan_handle: Sorgu veya stored procedure yürütme planının benzersiz kimliği.
objtype: Planın türü. Örneğin, Proc stored procedure için, Adhoc ise doğrudan çalıştırılan sorgular içindir.
usecounts: İlgili sorgunun kaç kez kullanıldığını gösterir.
Neden OPTION (RECOMPILE) Kullanılıyor?
Bu, sorgunun kendisinin önbelleğe alınmasını engeller ve daha doğru bir sonuç almanızı sağlar. Aksi halde, sorgunun planı da önbelleğe alınabilir ve yanlış usecounts bilgisi gösterebilir.
Aşağıdaki ifade ile ilgili handle execution plan cache’den silinmektedir. İlgili plan silindikten sonra sorgu tekrardan çalışmasını istediğimiz şekilde çalıştırılır. Doğru query plan oluşmasını sağlarız.


2. DBCC DROPCLEANBUFFERS
Bu komut, SQL Server’ın veri önbelleğini (buffer cache) temizler. Veritabanı sayfalarının fiziksel bellekteki kopyaları temizlenir ve SQL Server veri okuma işlemleri için tekrar disk erişimi yapar. Üzerinde değişiklik olmamış veriyi temizleme işlemi yapar. Öncelikle diskten memory’e(buffer cache) aktarılır ve sonrasında memory üzerinden kullanıcılara iletilir. Eğer veri üzerinde değişiklik yapılırsa checkpoint işlemi gerçekleştiğinde bu değişiklik yapılan veriler disk’e yazılır. Üzerinde değişiklik olmayan kayıtlar ise clean buffer olarak adlandırılır.
Kullanım:
DBCC DROPCLEANBUFFERS;
Kullanıldığında, SQL Server önbellekteki temiz (değiştirilmemiş) veri sayfalarını kaldırır. Genellikle sorguların performansını test etmek için kullanılır (örneğin, ilk çalıştırmada disk erişimi performansını görmek için). Çalıştırmadan önce ‘CHECKPOINT’ komutunu kullanarak değiştirilmiş sayfaları diske yazmanız önerilir. CHECKPOINT, değiştirilmiş verileri (dirty pages) diske yazarak, güvenli bir buffer temizleme işlemi sağlar
CHECKPOINT;
DBCC DROPCLEANBUFFERS;
Önemli Uyarılar
1. Bu komutlar, çalışan bir sistemi yavaşlatabilir.
2. Bu komutlar sadece performans testleri veya sorgu optimizasyonu sırasında kullanılmalıdır.
3. Bu komutları çalıştırabilmek için genellikle sysadmin veya db_owner yetkisine sahip olmanız gerekir.
Genel olarak aşağıdaki yapıda çalışmaktadır.
Değiştirilen veri sayfalarını diske yazmak için CHECKPOINT kullanılır.
CHECKPOINT;
Veri önbelleğini temizler (buffer cache)
DBCC DROPCLEANBUFFERS;
Sorgu planlarını temizler (execution plan cache)
DBCC FREEPROCCACHE;
Bu makalede DBCC FREEPROCCACHE VE DBCC DROPCLEANBUFFERS ifadelerini detaylı bir şekilde görmüş olduk. Başka bir makalede görüşmek dileğiyle.
“Gurura kapılarak insanlara burun kıvırma, ortalıkta çalım satarak yürüme; unutma ki Allah gurura kapılıp kendini beğenen hiç kimseyi sevmez.”Lokman-18