Tek Akış Toplam davranış


11

Sorgu:

declare @X xml = '
<item ID = "0"/>
<item ID = "1"/>
<item/>
<item/>';

select I.X.value('@ID', 'int')
from @X.nodes('/item') as I(X);

Sonuç:

-----------
0
1
NULL
NULL

Yürütme planı:

resim açıklamasını buraya girin

Üst dal XML'i dört satıra parçalar ve alt dal öznitelik değerini alır ID.

Bana garip gelen şey, Akış Toplama işlecinden döndürülen satır sayısıdır. Filtre'den gelen 2 satır, XML'deki IDbirinci ve ikinci itemdüğümlerden alınan özniteliktir . Akış Toplamı, İç Birleştirmeyi bir Dış Birleştirmeye etkili bir şekilde çevirerek her giriş satırı için bir tane olmak üzere dört satır döndürür.

Bu, Stream Aggregate'in başka durumlarda da yaptığı bir şey mi yoksa XML sorguları yaparken sadece garip bir şey mi oluyor?

Sorgu planının XML sürümünde, bu Akış Toplama'nın daha önce fark ettiğim diğer Akış Toplamalarından daha farklı davranması gerektiği konusunda herhangi bir ipucu göremiyorum.

Yanıtlar:


13

Agrega skaler bir agregadır (maddeye göre grup yok). Bunlar, giriş boş olsa bile, her zaman bir satır üretmek üzere SQL Server'da tanımlanır.

Bir İçin sayıl agrega, MAXhiçbir satır NULL, COUNThiçbir satır örneğin sıfırdır. Optimize edici bu konuda her şeyi bilir ve uygun koşullarda bir dış birleştirmeyi bir iç birleştirmeye dönüştürebilir.

-- NULL for a scalar aggregate
SELECT MAX(V.v) FROM (VALUES(1)) AS V (v) WHERE V.v = 2;

-- No row for a vector aggregate
SELECT MAX(V.v) FROM (VALUES(1)) AS V (v) WHERE V.v = 2 GROUP BY ();

Agregalar hakkında daha fazla bilgi için Skaler ve Vektör Agregaları ile Eğlenceli makaleme bakın .


10

Burada hatırlanması gereken şey, yürütme planlarının verileri emmesidir.

Bu nedenle, Yuvalanmış Döngü operatörü Akış Toplamını 4 kez çağırır. Akış Toplamı, Filtreyi 4 kez de çağırır, ancak yalnızca iki kez bir değer alır.

Böylece Akış Toplamı dört değer verir. İki kez bir değer verir ve iki kez Null verir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.