SQL Server OPTIMIZE FOR

SQL Server 2005 versiyonu ile hayatımıza giren bu özellik ,sorgularımız ilk çalıştırıldığında oluşturulacak olan Execution Plan için parametre değerlerini bu özellik sayesinde biz belirleyebilmekteyiz. Peki bu özellik ne işimize yarayacak gibi soruları duyar gibiyim. Genel de yazdığımız sorgularda değişkenleri ve parametreleri sıkça kullanmaktayız. Sorgularımızda değerleri doğrudan kullanmak yerine değişken veya parametre olarak kullandığımız da SQL Server Execution Planı oluşturmak için istatistiklerin ortalama değerini kullanmaktadır. Bu da sorgumuz ilk çalıştığında oluşturduğu Execution Plan ın diğer parametre değerleri içinde kullanılacağından yanlış oluşan Execution Plan da tüm sorgularda kullanıldığında sistemde büyük problemler oluşturabileceğinden bu durumu ortadan kaldırmak için bu özelliği kullanabiliriz.

ÖR 1 :

SELECT
	SalesOrderId
   ,OrderDate
FROM Sales.SalesOrderHeader
WHERE SalesPersonID = 288

ÖR 2 :

SELECT
	SalesOrderId
   ,OrderDate
FROM Sales.SalesOrderHeader
WHERE SalesPersonID = 277

Yukarıda ÖR 1 ve ÖR 2 de aynı query yapısına sahip fakat farklı SalesPersonID ler ile sorgulama yapılan iki adet query miz bulunmaktadır.

Her ikisinin de Execution Planı incelendiğinde birbirinden farklı olduğunu yukarıda ki ekran görüntüsünde görmektesiniz.

Aynı işlemi bir de parametre olarak gönderip incelediğimiz de ise ;

ÖR 3 :

DECLARE @SalesPersonID INT;
SET @SalesPersonID = 288;
SELECT
	SalesOrderId
   ,OrderDate
FROM Sales.SalesOrderHeader
WHERE SalesPersonID = @SalesPersonID

ÖR 4 :

DECLARE @SalesPersonID INT;
SET @SalesPersonID = 277;
SELECT
	SalesOrderId
   ,OrderDate
FROM Sales.SalesOrderHeader
WHERE SalesPersonID = @SalesPersonID

Yukarıda değişken ile hazırladığımız query lerimizin Execution Planını incelediğimiz de ise aşağıda gördüğümüz gibi aynı Execution Planı kullandığını görmekteyiz. Bunun sebebi , çalışma zamanında değişkenin değerine göre değil , yukarıda da bahsettiğim üzere değişken ve parametrelerde ortalama istatistik bilgisine göre Execution Planın oluşturulmasıdır.

Prod sistemlerde en çok sıkıntı yaratan konulardan ve performansa dayalı süreç olduğundan yoğun sistemler de bu tarz problemler ile sık karşılaşılmaktadır.

Genellikle Stored Procedure ler de karşılaşılan bu durum , ilk çalıştığında yanlış Execution Plan ın oluşması ile daha sonra ki EXEC lerde bu plan üzerinden gidilmesinden dolayı problem an ve an büyümekte olacaktır.

Bu durumdan kurtulmak için , aynı query i OPTIMEZER FOR özelliği ile doğru değişken ile doğru Execution Plan oluşmasını sağlayabiliriz.

ÖR 5 :

DECLARE @SalesPersonID INT;
SET @SalesPersonID = 277;
SELECT
	SalesOrderId
   ,OrderDate
FROM Sales.SalesOrderHeader
WHERE SalesPersonID = @SalesPersonID
OPTION (OPTIMIZE FOR (@SalesPersonID = 288));

 

Query mizi incelediğimizde aynı query ÖR 3 de yanlış Execution Plan oluştururken OPTIMIZE FOR özelliğiyle SalesPersonID değerini 288 e göre Execution Plan oluştur diyerek doğru yani dhaa sağlıklı Execution Plan oluşturup bundan sonra ki tüm işlemlerde bu planın oluşması sağlanmaktadır.

 

Teşekkürler.

Leave a Reply

Your email address will not be published. Required fields are marked *