अजीब धारा का व्यवहार


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

निष्पादन योजना:

यहाँ छवि विवरण दर्ज करें

शीर्ष शाखा XML को चार पंक्तियों में विभाजित करती है और नीचे की शाखा विशेषता के लिए मूल्य प्राप्त करती है ID

मुझे जितना अजीब लगता है, वह स्ट्रीम एग्रीगेट ऑपरेटर से लौटी पंक्तियों की संख्या है। फ़िल्टर से आने वाली 2 पंक्तियाँ XML में IDपहले और दूसरे itemनोड से विशेषता है । स्ट्रीम एग्रीगेट चार पंक्तियों को लौटाता है, प्रत्येक इनपुट पंक्ति के लिए, प्रभावी रूप से इनर जॉइन को एक बाहरी जॉइन में बदल देता है।

क्या यह कुछ ऐसा है जो स्ट्रीम एग्रीगेट अन्य परिस्थितियों में भी करता है या क्या यह एक्सएमएल प्रश्नों को करते समय कुछ अजीब है?

मैं क्वेरी प्लान के XML संस्करण में कोई संकेत नहीं देख सकता हूं कि यह स्ट्रीम एग्रीगेट किसी भी अन्य स्ट्रीम एग्रीगेट की तुलना में किसी भी अलग तरह से व्यवहार करना चाहिए जो मैंने पहले देखा है।

जवाबों:


13

कुल एक अदिश समुच्चय है (खंड द्वारा कोई समूह नहीं)। ये SQL सर्वर में हमेशा एक पंक्ति उत्पन्न करने के लिए परिभाषित होते हैं, भले ही इनपुट खाली हो।

एक के लिए अदिश कुल, 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

यहाँ याद रखने वाली बात यह है कि निष्पादन योजनाएँ डेटा को चूसती हैं।

इसलिए नेस्टेड लूप ऑपरेटर स्ट्रीम एग्रीगेट को 4 बार कॉल करता है। स्ट्रीम एग्रीगेट फ़िल्टर को 4 बार कॉल करता है, लेकिन केवल दो बार मान प्राप्त करता है।

इसलिए स्ट्रीम एग्रीगेट चार मूल्य देता है। दो बार यह एक मूल्य देता है, और दो बार यह नल देता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.