พฤติกรรมการรวมของสตรีม


11

ค้นหา:

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

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

ผลลัพธ์:

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

แผนการดำเนินการ:

ป้อนคำอธิบายรูปภาพที่นี่

สาขาด้านบน shreds XML IDเพื่อสี่แถวและสาขาด้านล่างเรียกค่าสำหรับแอตทริบิวต์

สิ่งที่ทำให้ฉันแปลกประหลาดคือจำนวนแถวที่คืนจากผู้ดำเนินการรวมสตรีม แถว 2 ที่มาจากตัวกรองคือIDแอตทริบิวต์จากitemโหนดแรกและโหนดที่สองใน XML สตรีมรวมจะส่งคืนสี่แถวหนึ่งแถวสำหรับแต่ละแถวป้อนเปลี่ยนการเข้าร่วมด้านในเป็นการรวมภายนอกได้อย่างมีประสิทธิภาพ

นี่คือบางสิ่งที่ Stream Aggregate ทำในสถานการณ์อื่นเช่นกันหรือเป็นเพียงสิ่งแปลก ๆ ที่เกิดขึ้นเมื่อทำการค้นหา XML

ฉันไม่สามารถเห็นคำแนะนำใด ๆ ในแผนการสืบค้นเวอร์ชัน XML ที่ Stream Aggregate นี้ควรทำงานแตกต่างไปจาก Stream Aggregate อื่น ๆ ที่ฉันสังเกตเห็นมาก่อน

คำตอบ:


13

การรวมเป็นการรวมแบบสเกลาร์ (ไม่มีกลุ่มตามข้อ) สิ่งเหล่านี้ถูกกำหนดใน SQL Server เพื่อสร้างแถวเสมอแม้ว่าอินพุตจะว่างเปล่า

สำหรับเกลารวมMAXของแถวไม่เป็นNULL, COUNTของแถวไม่เป็นศูนย์ตัวอย่างเช่น เครื่องมือเพิ่มประสิทธิภาพรู้ทุกอย่างเกี่ยวกับเรื่องนี้และสามารถเปลี่ยนการรวมภายนอกเป็นการรวมภายในในสถานการณ์ที่เหมาะสม

-- 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 ();

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับมวลรวมดูบทความของฉันสนุกกับสเกลาร์และเวกเตอร์ขันธ์


10

สิ่งที่ต้องจำที่นี่คือแผนการดำเนินการดูดข้อมูลผ่าน

ดังนั้นผู้ดำเนินการ Nested Loop จึงเรียกใช้ Stream Aggregate 4 ครั้ง Stream Aggregate เรียกตัวกรอง 4 ครั้งเช่นกัน แต่รับค่าสองครั้งเท่านั้น

ดังนั้น Stream Aggregate จึงให้ค่าสี่ค่า ให้ค่าสองเท่าและเป็นสองเท่าให้ค่า Null

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.