MSSQL Server Execution Plan SORT Operatörü

Bu makalede MSSQL Server Execution Plan SORT Operatörü detaylı bir şekilde görmüş olacağız. Bazen sorgularımızda Order By ifadesini kullandığımızda  execution plan yapımızda SORT adında ayrı bir execution plan operatör’ü çıkmaktadır.

Yukarıdaki resimde clustered index scan yapısıyla tablomuzdaki tüm değerlerin geldiğini ve order by ifadesiylede execution plan yapımızda bir sort maliyeti çıktığını görmekteyiz. Index konusunda değinmiş olacağız sort maliyetinin çıkmasının öncelikle sebebi asc olarak sıralanan yapımızın tam tersi sıralama olan desc şeklinde sıralanmasıdır.

Şimdi SORT operatörünün Tooltip penceresini inceleyelim.

Tooltip penceremizde ilk olarak Estimated Number of Rows değerine bakalım. Bu değer bir önceki işlem sonucunda döndürülen ve sıralama için Sort operatörünün üzerinde işlem yapacağı kayıt sayısını belirtmektedir. Ayrıca Estimated Operator Cost değerinin %82 olması yani diğer bir değişle sorgu maliyetinin büyük bir kısmının sıralama işlemi için harcanması çok doğru değildir. Bizim örneğimizde sıralama için indeks kullanılmaması ve koşul operatörü olmadığı için kayıt sayısının fazla olması sıralama işlemi için maliyetin bu kadar yüksek olma nedeni olarak açıklanabilir. Fakat Execution planlarımızda sıralama için %50 üzerinde bir maliyet varsa sıralama işlemi incelenip bu maliyet düşürülmelidir. Aslında maliyeti düşürme işlemlerine başlamadan önce sıralama işleminin ne kadar gerekli olduğuna karar verilmeli ve eğer gerçekten gerekli değilse sıralama işlemi yapılmamalıdır. Bunun dışında illa verilerin sıralanması gerekiyorsa sıralama için en azından clustered indeks kullanılıp kullanılamayacağı araştırılmalıdır. Çünkü bildiğiniz gibi SQL Server verileri fiziksel olarak zaten clustered indeks değerine göre tutmaktadır. Bunun dışında diğer operatörlerde olduğu gibi özellikle indeksimizin olduğu alanları içeren koşul ifadeleri kullanmaya da özen gösterebiliriz.

Sort operatörü Execution planlarımızda sadece Order By ile sıralama yaparken karşımıza çıkmaz. Bunun dışında sorgu sonucunun listelenmesi için SQL Server’ın sıralı bir veri kümesine ihtiyaç duyduğu Union ve Distinct gibi operatörlerde de açıkça order by yazmasak dahi Sort operatörü karşımıza çıkabilmektedir. 

Yukarıdaki sorguda clustered index yapımızın indexslenmiş kolunu üzerinde sıralama işlemi yapmış olsaydık sort operatörünü görmemiş olacaktık. Sorgumuzun devamında Desc ifadesini görmüş olsaydık tekrardan sıralama işlemi yapmış olacaktık.

Tekrardan söylemek gerekirse Union ve Distinct gibi operatörlerde de açıkça order by yazmasak dahi Sort operatörü karşımıza çıkabilmektedir. 

Yukarıdaki ilk ifademizde select ikonunun üzerindeki ünlem işaretine değinecek olursak. The query memory grant detected ‘ExcessiveGrant’, which may impact the reliability. Hatası ile karşılaşırız. Bu uyarının anlamı: SQL Server, sorgunun çalışması için bellek (Memory Grant) ayırıyor. Ancak burada sorguya normalden fazla bellek ayrıldığı ve bunun sistem performansını olumsuz etkileyebileceği belirtiliyor.

Detaylar:
• Memory Grant (İstenen): Initial 103032 KB
• Gerçek Kullanılan: Used 39004 KB

Bu, SQL Server’ın sorgu için yaklaşık 103 MB bellek ayırdığını, ama sadece ~39 MB’lık kısmını kullandığını gösteriyor.

Bu duruma “Excessive Grant” deniyor çünkü:
• Gereksiz yere fazla bellek rezerve ediliyor.
• Bu durum yoğun sistemlerde başka sorguların yavaşlamasına veya sıraya girmesine sebep olabilir.

Bu gibi durumlarda index eksikliği, sıralama işleminin büyük veri kümesi üzerinde yapılması veya select ifadesinde tüm verinin belleğe taşınması olabilir.

Bu makalede Sort operatörünün hangi durumlarda görebileceğimizi görmüş olduk. Başka bir makalede görüşmek dileğiyle..

Namazları ve orta namazını (üstlerine düşerek, titizlik göstererek) koruyun ve Allah’a gönülden boyun eğiciler olarak (namaza) durun. Bakara Suresi, 238. Ayet

Author: Yunus YÜCEL

Bir yanıt yazın

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