MSSQL Server Execution Plan Filter  Operatörü

Bu makalede MSSQL Server Execution Plan Filter  Operatörünü detaylı bir şekilde görmüş olacağız. Bu operatör execution plan yapılarında  group by ifadelerinde sonra filtreleme işlemi için kullanmış olduğumuz Having operatöre kullanıldığında karşılaşılan bir operatör olarak karşımıza çıkmaktadır.

Having operatörünü kullandığımızda Execution planımıza Filter operatörü de eklenmiş oldu. Execution planlarımızı sağdan sola değerlendirdiğimizi düşünürsek dikkat edilmesi gereken bir nokta Filtre operatörünün Hash Match (Aggregate) operatöründen sonra yani veriler gruplandıktan sonra gruplanmış veriler üzerinde bir filtreleme işlemi uygulamasıdır. Bu da Having operatörü koşul belirtmek için kullanılsa bile Where operatöründe olduğu gibi işlemleri hızlandırmak yerine daha çok yavaşlatmaktadır. Çünkü daha önce de belirttiğimiz gibi tüm verinin gruplanması işlemi çok zaman alan bir işlem olup performans için gruplanacak olan veri sayısını düşürmemiz gerekmektedir. Hâlbuki Having operatörü ile gruplanan veri sayısı değişmez tüm veriler gruplandıktan sonra oluşan veri kümesi üzerinde filtreleme işlemi yapılır. Bu da Where operatörünün Having operatöründen daha performanslı çalıştığını gösterir.

Şimdi where ve having arasındaki farkları performans anlamında neyin daha iyi olup olmadığını belirleyelim.

WHERE Operatörü Execution sırasında veriler daha çekilmeden önce (veya çekilirken) çalışır. Yani, veri taraması (Scan) veya indeks taraması (Index Seek) yaparken satırları filtreler.
• Avantajı:
WHERE sayesinde veritabanı gereksiz verileri en baştan eler. Bu da daha az veri okumak, daha az I/O, daha az bellek tüketimi ve dolayısıyla çok daha hızlı execution plan anlamına gelir.
• Execution Plan’da etkisi:
Genellikle Index Seek, Predicate Pushdown gibi optimize edilmiş planlar görürüz. Filtreleme erkenden yapıldığı için Query Optimizer daha agresif optimizasyonlar uygulayabilir.

HAVING Operatörü Gruplama (GROUP BY) ve agregasyon (SUM, COUNT, AVG vs.) yapıldıktan sonra çalışır. Yani veriler önce çekilir, gruplandırılır ve bu grupların sonuçları üzerinde HAVING filtresi uygulanır.
• Dezavantajı:
Çok fazla veri okunup belleğe alındıktan sonra filtreleme yapıldığı için, özellikle büyük veri setlerinde gereksiz işlem yükü oluşur.
Daha çok veri taranır, daha çok CPU ve bellek kullanılır.
• Execution Plan’da etkisi:
Planın başlarında büyük Scan veya Hash Aggregate işlemleri olur. HAVING sonrası filtre azalsa bile, başta fazladan iş yükü oluştuğu için performansı kötü etkileyebilir.

Sonuç olarak:

• Eğer satır bazlı bir filtre yapıyorsan, mutlaka WHERE kullanmalısın.
• HAVING sadece gruplandırılmış sonuçlara özel bir filtre gerekiyorsa kullanılmalı.
• WHERE kullanımı, execution plan’da daha az adım, daha küçük veri boyutu ve daha hızlı sorgular anlamına gelir.

Compute Scalar operatörü ise bir matemetiksel işlem yapıldığı için kullanılmıştır.

Bu makalede execution yapılarında görülen Filter  ifadesine değinmiş olduk. Başka bir makalede görüşmek dileğiyle..

Onlar ki, Allah anıldığı zaman kalpleri ürperir; kendilerine isabet eden musibetlere sabredenler, namazı dosdoğru kılanlar ve rızık olarak verdiklerimizden infak edenlerdir. Hac Suresi, 35. Ayet

Author: Yunus YÜCEL

Bir yanıt yazın

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