यह स्ट्रीम एग्रीगेट क्यों आवश्यक है?


12

इस क्वेरी को देखें। यह बहुत सरल है (तालिका और सूचकांक परिभाषाओं के लिए पोस्ट का अंत देखें और एक रेपो स्क्रिप्ट):

SELECT MAX(Revision)
FROM dbo.TheOneders
WHERE Id = 1 AND 1 = (SELECT 1);

नोट: "और 1 = (सिलेक्ट 1) इस क्वेरी को ऑटो-पैरामीटर से बनाए रखने के लिए है, जो मुझे लगा था कि इस मुद्दे को भ्रमित कर रहा था - यह वास्तव में उस क्लॉज के साथ या उसके बिना एक ही योजना प्राप्त करता है"

और यहाँ योजना है ( योजना लिंक पेस्ट करें) :

एक धारा एजी के साथ योजना

चूंकि वहां "टॉप 1" है, इसलिए मैं स्ट्रीम एग्रीगेट ऑपरेटर को देखकर हैरान था। यह मेरे लिए आवश्यक नहीं लगता है, क्योंकि केवल एक पंक्ति होने की गारंटी है।

उस सिद्धांत का परीक्षण करने के लिए, मैंने इस तार्किक समकक्ष क्वेरी को आज़माया:

SELECT MAX(Revision)
FROM dbo.TheOneders
WHERE Id = 1
GROUP BY Id;

यहाँ उस के लिए योजना है ( योजना लिंक पेस्ट करें ):

बिना स्ट्रीम एग के प्लान करें

निश्चित रूप से, समूह द्वारा योजना बिना स्ट्रीम ऑपरेटर के बिना प्राप्त करने में सक्षम है।

ध्यान दें कि दोनों प्रश्न सूचकांक के अंत से "पीछे की ओर" पढ़ते हैं और अधिकतम संशोधन प्राप्त करने के लिए "शीर्ष 1" करते हैं।

मुझे यहां क्या समझ नहीं आ रहा है? क्या स्ट्रीम एग्रीगेट वास्तव में पहली क्वेरी में काम कर रहा है, या इसे समाप्त करने में सक्षम होना चाहिए (और यह केवल ऑप्टिमाइज़र की सीमा है कि यह नहीं है)?

वैसे, मुझे लगता है कि यह एक अविश्वसनीय रूप से व्यावहारिक समस्या नहीं है (दोनों प्रश्न सीपीयू और बीते हुए समय के 0 एमएस की रिपोर्ट करते हैं), मैं यहां दिखाए जा रहे आंतरिक / व्यवहार के बारे में उत्सुक हूं।


यहां ऊपर दिए गए दो प्रश्नों को चलाने से पहले मैंने जो सेटअप कोड दिया, वह है:

DROP TABLE IF EXISTS dbo.TheOneders;
GO

CREATE TABLE dbo.TheOneders
(
    Id INT NOT NULL,
    Revision SMALLINT NOT NULL,
    Something NVARCHAR(23),

    CONSTRAINT PK_TheOneders PRIMARY KEY NONCLUSTERED (Id, Revision)
);
GO

INSERT INTO dbo.TheOneders
    (Id, Revision, Something)
SELECT DISTINCT TOP 1000 
    1, m.message_id, 'Do...'
FROM sys.messages m
ORDER BY m.message_id
OPTION (MAXDOP 1);

INSERT INTO dbo.TheOneders
    (Id, Revision, Something)
SELECT DISTINCT TOP 100 
    2, m.message_id, 'Do that thing you do...'
FROM sys.messages m
ORDER BY m.message_id
OPTION (MAXDOP 1);
GO

जवाबों:


16

यदि कोई पंक्तियाँ WHEREखंड से मेल नहीं खाती हैं तो आप इस समुच्चय की भूमिका देख सकते हैं ।

SELECT MAX(Revision)
FROM   dbo.TheOneders
WHERE  Id = 1
       AND 1 = 1 /*To avoid auto parameterisation*/
       AND Id%3 = 4  /*always false*/

उस स्थिति में शून्य पंक्तियाँ कुल में चली जाती हैं लेकिन यह अभी भी एक निकलती है क्योंकि NULLइस मामले में सही शब्दार्थ वापस आने हैं ।

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

यह वेक्टर के विपरीत एक स्केलर एग्रीगेट है।

आपकी "तार्किक रूप से समकक्ष" क्वेरी समतुल्य नहीं है। जोड़ने से GROUP BY Idयह एक सदिश समुच्चय बन जाता है और फिर सही व्यवहार होगा कि कोई पंक्तियाँ वापस न आए।

इस बारे में अधिक जानकारी के लिए स्केलर और वेक्टर एग्रीगेट्स के साथ फन देखें ।

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