Index Oluştururken JOIN Yapılan Kolonlara Dikkat Etmek

Bu makaleyi okumaya başlamadan önce index’ler ile ilgili daha detaylı bilgi almak için “SQL Server’da Index Kavramı ve Performansa Etkisi” isimli makaleyi okumanızı tavsiye ederim.

 

Eğer iki tabloyu sürekli aynı kolon üzerinden join yapan sorgularınız varsa mutlaka join yapılan kolonlar üzerinde index tanımlamalısınız. Örneğin AdventureWorks2014 veritabanında aşağıdaki sorgunun execution plan’ını aldığınızda aşağıdaki gibi bir sonuç gelecektir.

 

Execution plan’ı almak için SSMS üzerinde sorgu ekranındayken aşağıdaki siyah kare içersine alınmış kısma tıklamanız gerekir. Execution plan hakkında detaylı bilgi almak için “Execution Plan Nedir” isimli makaleyi okumanızı tavsiye ederim.

SELECT DISTINCT P.ProductID, P.Name
FROM Sales.SalesOrderDetail AS SOD
    JOIN Production.Product AS P
    ON SOD.ProductID = p.ProductID
WHERE P.ProductID = 707;

 

Eğer yukardaki sorgunun execution plan’ını AdventureWorks veritabanında alırsanız yukardaki ekrandaki gibi bir sonuç çıkmayabilir. Öncelikle SalesOrderDetail tablosundaki ProductID üzerinde tanımlı olan index’i silip tekrar execution plan’ı almanız gerekir.

 

Execution plan’da görüldüğü gibi SalesOrderDetail tablosu için tek kayıt select etmemize rağmen Clustered Index Scan işlemi gerçekleşmiş.  Çünkü join’e giren kolon üzerinde index yok.(Join’e giren kolon’un üzerinde index olmasının önemini göstermek için yukarda index’i sildirdim)

 

Şimdi daha önce sildiğimiz index’i aşağıdaki gibi tekrar oluşturarak sorgunun execution plan’ını yeniden alalım.

CREATE NONCLUSTERED INDEX [IX_ProductID] ON [Sales].[SalesOrderDetail]
(
[ProductID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF,
ONLINE = ON, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)

 

Gördüğünüz gibi Clustered Index Scan işlemi Index Seek’e döndü.

 

Clustered Index Scan, Index Seek gibi işlemlerin ne anlama geldiğini detaylı olarak görmek için “SQL Server’da İstatistik Kavramı ve Performansa Etkisi” isimli makaleyi okumak isteyebilirsiniz.

 

Loading

Leave Your Comment