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