Index Oluştururken Sorgudaki Order By Yönüne Bakmak(ASC,DESC)

17 Tem by NURULLAH ÇAKIR

Index Oluştururken Sorgudaki Order By Yönüne Bakmak(ASC,DESC)

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.

 

Index oluştururken, Order By ifadesinde index yoksa sorgu gelen sonuç kümesini sıralayacaktır ve ayrıca bir sort maliyeti ortaya çıkacaktır. Ayrıca index’i oluşturmamızı gerektiren sorgudaki Order By ifadesi için index oluşturuyorsak sıralanacak kolonunun nasıl sıralanacağı da önemlidir.

 

 Daha kolay anlaşılması için bir örnek üzerinden gideceğim.

 

Testlerimizi AdventureWorks2014 veritabanında yapacağız.

 

Öncelikle aşağıdaki sorgunun execution plan’ına aşağıdaki resimde görüldüğü gibi bir bakalım.

SELECT RejectedQty, ((RejectedQty/OrderQty)*100) AS RejectionRate,
    ProductID, DueDate
FROM Purchasing.PurchaseOrderDetail
where ProductID between 100 AND 1000
ORDER BY RejectedQty DESC, ProductID ASC;

 

 

Gördüğünüz gibi sorgunun maliyetinin büyük bir bölümünü sort operasyonu oluşturuyor. Aşağıdaki gibi sorguyu cover edecek bir index oluşturalım ve tekrar yukardaki gibi execution plan’a bakalım.

CREATE NONCLUSTERED INDEX IX_PurchaseOrderDetail_RejectedQty
ON Purchasing.PurchaseOrderDetail
    (RejectedQty ASC, ProductID ASC, DueDate, OrderQty);

 

 

Sorgu oluşturduğumuz index’i kullandı fakat hala sort operasyonu maliyetin büyük bir kısmını oluşturuyor. Bunun nedeni oluşturduğumuz index’te RejectedQty kolonunun sıralaması ASC iken sorguda bu kolon DESC şeklinde sıralanmış. Şimdi aşağıdaki şekilde index’i sadece RejectedQty kolonunun sıralamasını ASC’den DESC’ye çevirerek yeniden farklı bir isimde oluşturalım ve execution plan’ı yeniden alalım.

CREATE NONCLUSTERED INDEX IX_PurchaseOrderDetail_RejectedQtyWITHDESC
ON Purchasing.PurchaseOrderDetail
    (RejectedQty DESC, ProductID ASC, DueDate, OrderQty);

 

 

Gördüğünüz gibi sadece tek kolonun sıralamasını değiştirerek index’i yeniden oluşturduk ve sorgunun maliyetinde ciddi bir düşüş oldu. Index SCAN işlemi ilk sorguda da, ikinci sorguda da aynı. Fakat oran’ı %8’den %82’ye çıktı. Bu sorgunun toplam maliyetinin ne kadar azaldığını gösteriyor. Ayrıca sorgudaki sort operasyonu maliyetini artık göremiyoruz. Çünkü sorgu index üzerinden zaten istediğimiz sırada geliyor. Bu yüzden tekrar sıralama ihtiyacı bulunmuyor.

 

Loading

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir