Bu makalede MSSQL Server Execution Plan TOP Operatörü kavramını detaylı bir şekilde ele almış olacağız. Execution plan yapımızda Top operatörü genellikle sorgularımızda sonuç kümesini filtrelemek için kullandığımız Top ifadesinin sonucunda Execution planlarımızda karşımıza çıkmaktadır.
Bu operatör, veri akışını izler ve belirtilen satır sayısına ulaştığı anda altındaki tüm işlemleri durdurur. SQL Server Query Optimizer, bir TOP ifadesi gördüğünde “Bütün tabloyu taramama gerek yok, sadece ilk N satırı bulsam yeter” diyerek planı optimize eder. Buna Row Goal stratejisi denir. Order by işlemlerinde kolonda herhangi bir index yapısı yoksa tablonun tamamını okumaktadır. Sıralanan kolonda index varsa tüm kolonları taramaz sadece top ifadesinde belirtilen sayıda satır almaktadır.

Yukarıda görüldüğü gibi sorgularımızda top ifadesi varsa Select sorgumuzda belirli sayıda ifadeleri çağırdığımız anlamına gelmektedir.
Top operatörünü bazı durumlarda sorgularımızda kullanmasak bile Execution planlarımızda görebiliriz. Bu durum genellikle Update işleminden önce değiştirilecek kayıtların sayısını garanti etmek için karşımıza çıkmaktadır.

Top operatörü sorgumuzdan dönen kayıt sayısını herhangi bir koşula bağlı olmadan sınırlamaktadır ve çoğu zaman bu operatör Order By ifadesi ile sıralanmış bir veri kümesi üzerinde işlem yapmaktadır. Bildiğiniz gibi sorgularımızda Order By ile sıralama yaptığımızda eğer uygun bir indeks yok ise SQL Server Sort operatörünü kullanmaktadır. Böyle durumlarda Sort operatöründen sonra Top operatörü kullanılmaz. Bunun yerine Sort operatörünün özel bir hali olan ve Top operatörü ile birleştirilmiş hali olan Top N Sort operatörü karşımıza çıkmaktadır.
Yukarıdaki resimde sort operatörü sıralama işlemi yapmadan önce Top N Sort ifadesinide aktif hale getirmektedir. Sql server top ifadesi ile birlikte order by ifadesi görünce sadece en yüksek 10 kaydın değerini getirmenin yeterli olduğunu anlıyor. Bu sebepten tam sıralama olan full sort yerine Top N Sort ile daha az maliyetli sıralama yapıyor.
Avantajları
- Hız (Early Exit): Eğer istediğiniz veriler bir indeks üzerinde sıralıysa, SQL Server tablonun tamamını okumak yerine sadece en baştaki birkaç sayfayı okur ve işlemi bitirir. Bu, I/O kullanımını devasa oranda düşürür.
- Kaynak Tasarrufu: Bellek (Memory Grant) kullanımı genellikle daha düşük olur çünkü devasa veri setlerini belleğe alıp sıralamak zorunda kalmaz.
Dezavantajları
En büyük risk, Optimizer’ın “nasıl olsa az satır alacağım” diyerek yanlış kararlar vermesidir:
- SQL Server, 10 satırı hızlıca bulmak için Index Scan (tüm indeksi okuma) yerine maliyetli bir Index Seek + Key Lookup kombinasyonunu tercih edebilir. Ancak aranan veri indeksin sonlarındaysa, bu işlem çok uzun sürer.
- Eğer ORDER BY kullandığınız kolon üzerinde bir indeks yoksa, SQL Server önce tüm veriyi çekip sıralamak (Sort) zorundadır. Bu durumda TOP operatörü ancak sıralama bittikten sonra devreye girer ki bu da performans avantajını yok eder.
- Eğer ORDER BY kullanmadan TOP kullanırsanız, hangi satırların geleceği tamamen şansa (veya o anki fiziksel okuma sırasına) bağlıdır.
Eğer bir sorgu yavaşsa ve planda TOP operatörü görüyorsanız şu adımları izleyin:
- Sıralamayı Kontrol Edin: ORDER BY kullandığınız kolonlarda uygun bir indeks var mı? İndeks varsa, TOP operatörü veriyi “sıralamadan” (Sort operatörü olmadan) çekebilir.
- Sort Operatörüne Bakın: Eğer TOP operatörünün hemen altında bir Sort ikonu varsa, bu bir uyarı işaretidir. SQL Server önce her şeyi sıralıyor, sonra kesiyor demektir.
- İstatistikleri Güncelleyin: Row Goal stratejisi istatistiklere çok güvenir. Eğer istatistikler eskiyse, SQL Server “10 satırı 1 saniyede bulurum” derken 1 saat harcayabilir.
- Local Variable Etkisi: TOP (@Degisken) şeklinde kullanımda SQL Server kaç satır geleceğini kestiremeyebilir (genellikle 100 satır varsayar). Bu durumda OPTION (RECOMPILE) kullanmak planı optimize edebilir.
Bu makalede execution yapılarında görülen TOP ifadesine değinmiş olduk. Başka bir makalede görüşmek dileğiyle..
Sizin dostunuz (veliniz), ancak Allah, O’nun elçisi, rüku ediciler olarak namaz kılan ve zekatı veren mü’minlerdir. Maide Suresi, 55. Ayet
