SQL Server’da sorgularımız çalıştırılmadan önce yani Execution planları oluşturulduğunda Query Optimizer tarafından ilgili sorgumuz optimize edilir. Bu optimizasyon işleminin adımlarından bir tanesi de birden fazla tablo kullandığımız sorgularımızda verinin okunmasına ilk olarak hangi tablodan başlanacağıdır. Yani Join işlemlerinde sorgumuz için en uygun Execution plan hesaplanırken SQL Server tarafından hangi sırayla tabloya erişileceği belirlenir. Bu sıra SQL Server tarafından maliyet hesabı yapılarak seçildiği için genelde doğru olmasına rağmen nadiren SQL Server yanlış sıralama yapabilmektedir. İşte nadir karşılaşılabilecek böyle durumlarda FORCE ORDER seçeneği ile SQL Server’ın herhangi bir sıralama yapmadan sorgumuzda yazdığımız sırada tablolara erişmesini sağlayabiliriz. Şimdi FORCE ORDER seçeneğinin kullanımını bir örnek üzerinde görelim.
select p.ProductID,p.Name,p.Color,soh.OrderDate from Production.Product as p inner join Sales.SalesOrderDetail as sod on
p.ProductID=sod.ProductID inner join
Sales.SalesOrderHeader as soh on
soh.SalesOrderID=sod.SalesOrderID where p.ProductID=796

Yukarıdaki resimde gördüğümüz gibi öncelikle Sales.SalesOrderDetail tablosu ile Sales.SalesOrderHeader tabloları birleştirilmiş ve bunun sonucunda oluşan kayıt kümesi ile Production.Product tablosundaki kayıtlar birleştirilmiştir. Dikkat ederseniz SQL Server tablolara erişirken bizim yazdığımız sırayı kullanmadı kendisi optimizasyon işlemi sonucunda tablolara hangi sırayla erişeceğine karar verdi. Şimdi aynı sorgumuza FORCE ORDER seçeneğimizi ekleyerek çalıştırıp Execution planımızı inceleyelim.
select p.ProductID,p.Name,p.Color,soh.OrderDate from Production.Product as p inner join Sales.SalesOrderDetail as sod on p.ProductID=sod.ProductID inner join Sales.SalesOrderHeader as soh on soh.SalesOrderID=sod.SalesOrderID where p.ProductID=796 option(Force Order)
Yukarıdaki sorgumuzun Execution planı aşağıdaki gibi olacaktır.

Yukarıdaki resimde gördüğümüz gibi sorgumuza FORCE ORDER seçeneğini ekledikten sonra Execution planımızı incelediğimizde SQL Server’ın ilk olarak Production.Product tablosu ile Sales.SalesOrderDetail tablosunu kullandığını ve daha sonra bu iki tablodan elde edilen sonuç kümesi ile Sales.SalesOrderHeader tablosunu birleştirdiğini görebiliriz. Bu sıra da dikkat edilirse bizim sorgumuzda yazdığımız sıraya tekabül etmektedir.
FORCE ORDER seçeneği çok nadiren kullanılan bir seçenek olup bu seçeneğin çok gerekmedikçe kullanılmaması gerekmektedir.
Bu makalede execution yapılarında görülen FORCE ORDER Query Hint ifadesine değinmiş olduk. Başka bir makalede görüşmek dileğiyle..
İman etmiş kullarıma söyle: “Alış-verişin ve dostluğun olmadığı o gün gelmezden evvel, dosdoğru namazı kılsınlar ve kendilerine rızık olarak verdiklerimizden gizli ve açık infak etsinler.” İbrahim Suresi,