
Bu makalede MSSQL Server Execution Plan Gather Streams Operatörünü detaylı bir şekilde görmüş olacağız. Paralelizmin tercih edildiği Execution planlarda kullanılan bir diğer operatör ise Gather Streams operatörüdür. Gather Streams operatörü birden fazla veri kümesini birleştirip tek bir veri kümesi oluşturmak için kullanılır. Bu sebeple genelde paralelizm kullandığımızda işlemler yapıldıktan sonra çıktımızın son halini birleştirmek amacıyla kullanılmaktadır.
Gather Streams ve Distribute Streams operatörlerinin kullanımını aşağıdaki gibi örneklendirebiliriz.

Yukarıdaki resimde gördüğümüz gibi gelen bir veri kümesi Distribute Streams ile birden fazla parçaya bölünürken, Gather Streams tarafından gelen birden fazla veri kümesi birleştirilerek tek bir parça haline getirilir. Fakat bu işlemler yapıldığında farklı Thread’ler kullanılsa bile aynı SPID(Server Process ID) üzerinden işlem yapılacaktır.

Bu operatör, paralel olarak çalışan birden fazla iş parçacığından (thread) gelen satırları toplar ve bunları tek bir çıktı akışına dönüştürür. Genellikle sorgu planının en solunda, sonuçların kullanıcıya sunulmadan önceki son aşamalarında görülür.
- Logical Operation: Gather Streams olarak belirtilmiştir.
- Number of Executions: Görselde 1 olarak görünüyor. Bu normaldir çünkü toplama işlemi sonucunda artık tek bir “ana” süreç kalmıştır.
Yukarıda verilen Tooltip penceresini yorumlarsak:
- Actual Number of Rows (63.942): Paralel çalışan tüm kolların toplamda birleştirdiği satır sayısıdır.
- Estimated Number of Rows (706.201): SQL Server bu noktada yaklaşık 700 bin satır toplanacağını tahmin etmiş.
- Tahmin Hatası: Gerçekte gelen veri (63k), tahmin edilenin (706k) yaklaşık %10’u kadar. Bu büyük fark, planın ilerleyen kısımlarında yanlış kararlar verilmesine (yanlış join tipi seçimi gibi) neden olmuş olabilir.
- Estimated Operator Cost: 0.4 (%0). Veriyi sadece toplamak işlemci için çok ucuz bir iştir; asıl yük verinin işlendiği paralel kısımlardadır.
Parallelism Skew(dengesizlik) olup olmadığını anlamak için bu operatör harika bir kontrol noktasıdır.
Görseldeki Actual Number of Rows satırına sağ tıklayıp “Properties” dersen veya (eğer SSMS sürümün uygunsa) solundaki artı simgesine basarsan şunu görmelisin:
- Thread 1: 60.000 satır
- Thread 2: 3.000 satır
- Thread 3: 900 satır
- Thread 4: 42 satır
Eğer dağılım buna benziyorsa, bir önceki aşamada (Distribute Streams tarafında) verinin eşit dağıtılamadığını kesinleştirmiş olursun.
Özet: İki Operatör Arasındaki Fark
- Distribute Streams: İşi bölüştürür (Paralelliği başlatır).
- Gather Streams: İşleri toplar (Paralelliği bitirir).
Önemli Not: Eğer Gather Streams operatöründen sonra hala çok ağır işlemler (sıralama – Sort gibi) varsa, bu işlemler paralel değil, tek bir çekirdek üzerinde yapılıyor demektir. Bu da performans darboğazına yol açar.
Bu makalede execution yapılarında görülen Gather Streams ifadesine değinmiş olduk. Başka bir makalede görüşmek dileğiyle..
Eğer onlar tevbe edip namazı kılarlarsa ve zekatı verirlerse, artık onlar sizin dinde kardeşlerinizdir. Bilen bir topluluk için ayetleri böyle birer birer açıklarız. Tevbe Suresi, 11. Ayet
