Bu makalede MSSQL Server Execution Plan Segment ve Sequence Project Operatörlerini detaylı bir şekilde görmüş olacağız. SQL Server üzerinde geliştirme yaparken daha karmaşık sorgularda karşımıza çıkan Segment Operatörü, kendisine gelen veriyi belli kriterlere göre ayrıştıran diğer bir ifadeyle gruplandıran bir operatördür. Sıklıkla row_number(), rank() gibi Ranking fonksiyonlarını Over operatörü ile kullandığımız sorgularda SQL Server sonuç kümesi içinde bir gruplama yaparak bu gruplama işlemine göre Ranking yani numaralandırma işlemini yaparken karşımıza çıkmaktadır. Bu numaralandırma işleminin yapılabilmesi için elimizde bulunan veri kümesini belli kriterlere göre Segment Operatörü ayrıştırmaktadır. Segment Operatörünün işlem yapabilmesi için bu operatörün kullandığı veri kümesi sıralı olmalıdır. Bu sebeple eğer uygun index vasıtasıyla veri okunmamışsa Segment Operatöründen önce Sort operatörü ile veri kümesi üzerinde sıralama işlemi yapılacaktır.
Biraz karmaşık olan Segment Operatörünü daha iyi anlamak için elimizde müşteri verilerinin tutulduğu bir tablo olduğunu düşünelim. Bu tablomuzda müşterinin yaşadığı şehir bilgisi ile ne zaman kayıt olduğu bilgileri de tutulmaktadır. Elimizdeki veri kümesinden her şehirden ilk müşterimiz olan kişinin bilgilerini elde etmeye çalışırsak SQL Server ilk olarak tüm veri kümesini şehir bilgisine göre ve müşterinin kayıt olduğu tarihe göre sıralayarak gruplara ayıracaktır. İşte tam olarak bu işlemin adı Segmentasyon işlemi olup bunun Execution Planlarımızdaki karşılığı ise Segment Operatörüdür.
Şimdi bu konuyla ilgili aşağıdaki gibi bir örnek yapalım.
SELECT ProductId,NAME
,Color,ListPrice
,ROW_NUMBER() OVER (PARTITION BY Color ORDER BY ListPrice DESC)
FROM Production.Product
WHERE Color IS NOT NULL
Yukarıdaki sorgumuzda Production.Product tablomuzdaki kayıtlarımızı Color değerine göre gruplayarak Row_number() ranking fonksiyonu ile numara verme işlemi yapıyoruz. Bu işlem yapılırken numaralandırma işleminde ListPrice kolonu kullanılıyor. Diğer bir ifadeyle sorgumuz tablomuzda bulunan ürünleri renklere göre gruplandırarak her bir grubu kendi içerisinde ListPrice kolonunu kullanarak sıralıyor ve bu sıralamaya göre bir numara ataması yapıyor. Şimdi sorgumuzun Execution Planını inceleyelim.

Yukarıdaki resimde gördüğümüz Execution Planımızı incelediğimizde öncelikle Clustered Index Scan işlemi yapılarak tüm kayıtların okunduğunu görebiliriz. Sonraki Sort operatörümüz ile okunan veri kümesi üzerinde sırama yapılmaktadır. Dikkat ederseniz sıralama işlemi Segment operatöründen önce yapılmaktadır. Bunun sebebi ise yukarıda belirttiğimiz gibi Segment operatörünün kullanacağı veri kümesi sıralı olmalıdır. Sort operatöründen sıralı olarak veriyi okuyan Segment operatörü ise bu veriyi Color değerine göre gruplandırmaktadır.
Segment Operatörünün bir diğer özelliği ise gruplandırmış olduğu veriyi kendisinden sonraki operatöre aktarmak için ekstra bir kolon oluşturup kullanmaktadır. Bu kolon sanal bir kolon olup sorgu çıktımızda görünmese bile Execution Planımızın detaylarını inceldiğimizde bu kolonu görebilmekteyiz. Şimdi Execution Planımızda bulunan Segment Operatörün üzerine gelerek aşağıdaki gibi Tooltip penceresinin açılmasını sağlayalım.

Yukarıdaki resimde gördüğümüz Segment operatörünün Tooltip penceresini incelediğimizde diğer operatörlerden farklı olarak Segment Column adıyla yeni bir değerimiz olduğunu görebiliriz. Bu kolonumuz yukarıda bahsettiğimiz gibi Segment operatörü tarafından oluşturulmuş ve veri kümesinin gruplaması için kullanılan Segment1003 adlı bir kolondur. Aynı zamanda yine Tooltip penceresinin alt kısmına dikkat ettiğimizde Color değerine göre bir gruplama işlemi yapıldığını açıkça görebiliriz.
Segment operatörü ile genellikle Ranking fonksiyonları kullandığımızda karşılaşsak bile sadece bu fonksiyonlarda değil SQL Server’ın sıralı bir veri kümesinin alt gruplara bölmesi işlemini temsil etmek için de kullanılmaktadır. Fakat Segment operatörü ile Ranking fonksiyonları sonucunda karşılaşmışsak bu operatörle beraber kullanılan Sequence Project Operatörü de Execution Planımızda yer alacaktır. Sequence Project Operatörünün tam olarak yapmış olduğu iş, Segment operatörü ile gruplandırılmış veri kümesi üzerinde yeni bir kolon oluşturularak kullanılan Ranking fonksiyona göre numaralarımızın oluşturulmasıdır. Oluşturulan bu numaralar ile bildiğiniz gibi sorgumuza yeni bir kolon eklenir. Şimdi de yukarıdaki sorgumuzun Execution planında gördüğümüz Sequence Project Operatörünün üzerine gelerek bu operatör hakkında detaylı bilgiyi Tooltip penceresinden alalım.

Yukarıdaki resimde gördüğümüz gibi Sequence Project Operatörümüzün Tooltip penceresinde yer alan açıklamayı okuduğumuzda sıralı bir veri kümesi üzerinde yapılan hesaplama sonucunda oluşan kolonu sonuç kümemize eklediğini görebiliriz. Bu eklenen kolonu da yukarıdaki resmimizin en alt kısmında Output listesinde bulunan Expr1002 adıyla görmekteyiz.
Sequence Project Operatörünün yukarıda da belirtiğimiz gibi Segment operatörü ile beraber kullanıldığını görebiliriz. Buna rağmen SQL Server’ın numaralandırma yapmadan gruplama ihtiyacı olduğu durumlarda Sequence Project Operatörü olmadan sadece Segment operatörü ile de karşılaşabiliriz.
Bu makalede execution yapılarında görülen Segment ve Sequence Project ifadesine değinmiş olduk. Başka bir makalede görüşmek dileğiyle..
De ki: “Şüphesiz benim namazım, ibadetlerim, dirimim ve ölümüm alemlerin Rabbi olan Allah’ındır.” En’am Suresi, 162. Ayet