रेत से भरा बोरा
पर शीर्ष गुणवत्ता ब्लॉग Posts® काम करते हुए, मैं कुछ अनुकूलक व्यवहार मैं वास्तव में पाया में आए क्रुद्ध दिलचस्प। मेरे पास तुरंत कोई स्पष्टीकरण नहीं है, कम से कम ऐसा नहीं है जिससे मैं खुश हूं, इसलिए मैं इसे यहां डाल रहा हूं, अगर कोई स्मार्ट शो करता है।
यदि आप साथ चलना चाहते हैं, तो आप यहां स्टैक ओवरफ्लो डेटा डंप के 2013 संस्करण को पकड़ सकते हैं । मैं टिप्पणियाँ तालिका का उपयोग कर रहा हूं, उस पर एक अतिरिक्त सूचकांक के साथ।
CREATE INDEX [ix_ennui] ON [dbo].[Comments] ( [UserId], [Score] DESC );
क्वेरी एक
जब मैं तालिका की तरह क्वेरी करता हूं, तो मुझे एक अजीब क्वेरी योजना मिलती है ।
WITH x
AS
(
SELECT TOP 101
c.UserId, c.Text, c.Score
FROM dbo.Comments AS c
ORDER BY c.Score DESC
)
SELECT *
FROM x
WHERE x.Score >= 500;
SARGable स्कोर पर समर्पित CTE के अंदर धकेल नहीं है। यह योजना में बहुत बाद में एक फिल्टर ऑपरेटर में है।
जो मुझे अजीब लगता है, चूंकि ORDER BY
फिल्टर के समान कॉलम पर है।
क्वेरी दो
यदि मैं क्वेरी को बदलता हूं, तो यह पुश हो जाता है।
WITH x
AS
(
SELECT c.UserId, c.Text, c.Score
FROM dbo.Comments AS c
)
SELECT TOP 101 *
FROM x
WHERE x.Score >= 500
ORDER BY x.Score DESC;
क्वेरी योजना बदलता है , भी, और डिस्क के लिए कोई रिसाव के साथ बहुत तेजी से चलता है। वे दोनों एक ही परिणाम उत्पन्न करते हैं, गैर-अनुक्रमित सूचकांक स्कैन में विधेय के साथ।
क्वेरी तीन
यह क्वेरी को इस तरह लिखने के बराबर है:
SELECT TOP 101
c.UserId, c.Text, c.Score
FROM dbo.Comments AS c
WHERE c.Score >= 500
ORDER BY c.Score DESC;
चतुर्थ भाव
व्युत्पन्न तालिका का उपयोग करने पर प्रारंभिक सीटीई क्वेरी के समान "खराब" क्वेरी योजना मिलती है
SELECT *
FROM ( SELECT TOP 101
c.UserId, c.Text, c.Score
FROM dbo.Comments AS c
ORDER BY c.Score DESC ) AS x
WHERE x.Score >= 500;
चीजें तब भी अजीब हो जाती हैं जब ...
मैं डेटा को आरोही करने के लिए क्वेरी को बदलता हूं, और फ़िल्टर को <=
।
इस सवाल को लंबे समय तक बनाए रखने के लिए, मैं सब कुछ एक साथ रखने जा रहा हूं।
प्रश्नों
--Derived table
SELECT *
FROM ( SELECT TOP 101
c.UserId, c.Text, c.Score
FROM dbo.Comments AS c
ORDER BY c.Score ASC ) AS x
WHERE x.Score <= 500;
--TOP inside CTE
WITH x
AS
(
SELECT TOP 101
c.UserId, c.Text, c.Score
FROM dbo.Comments AS c
ORDER BY c.Score ASC
)
SELECT *
FROM x
WHERE x.Score <= 500;
--Written normally
SELECT TOP 101
c.UserId, c.Text, c.Score
FROM dbo.Comments AS c
WHERE c.Score <= 500
ORDER BY c.Score ASC;
--TOP outside CTE
WITH x
AS
(
SELECT c.UserId, c.Text, c.Score
FROM dbo.Comments AS c
)
SELECT TOP 101 *
FROM x
WHERE x.Score <= 500
ORDER BY x.Score ASC;
योजनाओं
ध्यान दें कि इन प्रश्नों में से कोई भी गैर-अनुक्रमित सूचकांक का लाभ नहीं उठाता है - केवल एक चीज जो यहां बदलती है वह फ़िल्टर ऑपरेटर की स्थिति है। किसी भी स्थिति में सूचकांक पहुंच के लिए प्रेरित विधेय नहीं है।
एक प्रश्न दिखाई देता है!
क्या कोई कारण है कि SARGable विधेय को कुछ परिदृश्यों में धकेला जा सकता है और दूसरों में नहीं? अवरोही क्रम में हल किए गए प्रश्नों के अंतर दिलचस्प हैं, लेकिन उन और उन लोगों के बीच के अंतर जो विचित्र आरोही हैं।
रुचि रखने वाले किसी व्यक्ति के लिए, यहां केवल एक इंडेक्स के साथ योजनाएं हैं Score
: