IS NULL मान पर फ़िल्टर्ड इंडेक्स का उपयोग क्यों नहीं किया जाता है?


18

मान लें कि हमारे पास इस तरह एक तालिका परिभाषा है:

CREATE TABLE MyTab (
    ID INT IDENTITY(1,1) CONSTRAINT PK_MyTab_ID PRIMARY KEY
    ,GroupByColumn NVARCHAR(10) NOT NULL
    ,WhereColumn DATETIME NULL
    )

और इस तरह एक फ़िल्टर्ड नॉन-क्लस्टर्ड इंडेक्स:

CREATE NONCLUSTERED INDEX IX_MyTab_GroupByColumn ON MyTab 
    (GroupByColumn)
WHERE (WhereColumn IS NULL) 

इस क्वेरी के लिए यह इंडेक्स "कवरिंग" क्यों नहीं है:

SELECT 
    GroupByColumn
    ,COUNT(*)
FROM MyTab
WHERE WhereColumn IS NULL
GROUP BY GroupByColumn

मुझे यह निष्पादन योजना मिल रही है:

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

KeyLookup कहाँ के लिए है, जहां NULL प्रेडिकेट है।

यहाँ योजना है: https://www.brentozar.com/pastetheplan/?id=SJcbLHxO7

जवाबों:


23

इस क्वेरी के लिए यह इंडेक्स "कवरिंग" क्यों नहीं है:

कोई अच्छा कारण नहीं। यह उस क्वेरी के लिए एक कवरिंग इंडेक्स है।

कृपया फीसबैक आइटम के लिए यहां वोट करें: https://feedback.azure.com/forums/908035-sql-server/suggestions/32896348-filtered-index-not-used-when-is-null-and-key-looku

और फ़िल्टर किए गए इंडेक्स में वर्कअराउंड के रूप में शामिल हैं WhereColumn:

CREATE NONCLUSTERED INDEX IX_MyTab_GroupByColumn 
ON MyTab (GroupByColumn) include (WhereColumn)
WHERE (WhereColumn IS NULL) 

13
यह एक दशक पहले गेल शॉ द्वारा बताया गया था । फिर कनेक्ट मर गया। निकटतम मैं अब मिल सकती है feedback.azure.com/forums/908035-sql-server/suggestions/...
पॉल व्हाइट 9

3

मेरे पास वही मुद्दा था जो मुझे लगता है कि कुछ हफ्ते पहले परीक्षण किया गया था। मेरे पास एक प्राथमिक विधेय के साथ एक क्वेरी है जिसके लिए आवश्यक है कि परिणामों को एक पूर्ण क्लैटटाइमटाइम दिया जाए और मैंने फ़िल्टर किए गए सूचकांक का उपयोग करने के बारे में सोचा क्योंकि 2M + रिकॉर्ड के 25K NULL हैं और यह आंकड़ा बहुत जल्द घट जाएगा।

फ़िल्टर किए गए अनुक्रमणिका का उपयोग नहीं किया गया - मैंने 'गैर-विशिष्टता' या समानता के कारण ग्रहण किया - जब तक कि मुझे Microsoft समर्थन आलेख नहीं मिला, मैं कहता हूं :

इस समस्या को हल करने के लिए, उस कॉलम को शामिल करें जिसे लौटे हुए कॉलम में NULL के रूप में परीक्षण किया गया है। या, इस कॉलम को इंडेक्स में कॉलम शामिल करें।

इसलिए इंडेक्स (या शामिल करें) में कॉलम जोड़ना आधिकारिक एमएस की प्रतिक्रिया लगती है।


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