गुटनिरपेक्ष अनुक्रमणिका पहले से ही अव्यवस्थित अनुक्रमणिका का हिस्सा है


9

मैं धीमी गति से चलने वाली क्वेरी को डिबग कर रहा हूं और निष्पादन योजना में 51.6648 प्रभाव के साथ एक गैर-संकुल सूचकांक का सुझाव दिया गया है। हालाँकि, गैर-क्लस्टर किए गए अनुक्रमणिका में केवल प्राथमिक कुंजी (PK) समग्र क्लस्टर अनुक्रमणिका में स्तंभ शामिल हैं।

क्या यह सूचकांक में स्तंभों के क्रम के कारण हो सकता है? यानी यदि संकुलित सूचकांक में कॉलम अधिकांश चयनात्मक से कम से कम क्रम में नहीं हैं, तो क्या गैर-संकुलित सूचकांक के प्रदर्शन में सुधार की संभावना है?

गैर-क्लस्टर किए गए अनुक्रमणिका के अलावा केवल तीन में से दो पीके कॉलम शामिल हैं जिनमें तीसरा शामिल कॉलम के रूप में जोड़ा गया है। क्या एक includeऔर कारण है कि गैर-संकुल सूचकांक का उपयोग अधिक इष्टतम हो सकता है?

नीचे दी गई तालिका संरचनाओं का एक उदाहरण है:

Tables-

Retailers (
    RetailerID int PK, 
    name ...)

Retailer_Relation_Types (
    RelationType smallint PK, 
    Description nvarchar(50) ...)

Retailer_Relations (
    RetailerID int PK FK, 
    RelatedRetailerID int PK FK, 
    RelationType smallint PK FK, 
    CreatedOn datetime ...)

तालिका Retailer_Relationsमें निम्नलिखित समग्र पीके सूचकांक और सुझाए गए सूचकांक हैं-

CONSTRAINT PK_Retailer_Relations 
PRIMARY KEY CLUSTERED (
    RetailerID ASC, 
    RelatedRetailerID ASC, 
    RelationType ASC
    ) ON [PRIMARY]

CREATE NONCLUSTERED INDEX <NameOfIndex> 
ON Retailer_Relations (
    RetailerID, 
    RelationType
    ) 
INCLUDE (
    RelatedRetailerID
    )

जवाबों:


12

तालिका Retailer_Relations में निम्न समग्र PK अनुक्रमणिका और सुझाया गया सूचकांक है-

जबकि अनुपलब्ध अनुक्रमणिका सहायक हो सकती हैं और निश्चित रूप से काम कर सकती हैं, मैं लापता अनुक्रमणिकाओं पर बहुत अधिक समय नहीं बिताऊंगा, ये संकेत अनुमानित निष्पादन योजना पर बनाए गए हैं, वास्तविक निष्पादन योजना पर नहीं।

अधिक सटीक रूप से, ये सूचकांक संकेत योजना में ऑपरेटरों द्वारा उपयोग किए जाने वाले क्वेरी बक ™ की लागत को कम करने के आधार पर आधारित हैं। ऑप्टिमाइज़र अनुमानित लागतों की गणना करता है, और तदनुसार लापता सूचकांक संकेत जोड़ता है।

परिणामस्वरूप वे बहुत गलत हो सकते हैं। यदि आप अनिश्चित हैं यदि यह मदद करने जा रहा है, तो सबसे अच्छी बात यह है कि पहले और बाद की स्थिति का परीक्षण करें। आप SET STATISTICS IO, TIME ON;क्वेरी को चलाने से पहले बयान जोड़कर ऐसा कर सकते हैं ।

इसके अलावा, आप इन आंकड़ों को पढ़ने में आसान बनाने के लिए सांख्यिकीपार्क का उपयोग कर सकते हैं ।

क्या यह सूचकांक में स्तंभों के क्रम के कारण हो सकता है?

यह सही है, लापता सूचकांक बनाने से प्रश्नों पर चयनात्मकता में सुधार हो सकता है, उदाहरण के लिए यदि आपकी क्वेरी इस तरह दिखती है:

SELECT  RelatedRetailerID
FROM Retailer_Relations 
WHERE
RetailerID = 5 AND
RelationType = 20;

या इस तरह:

SELECT  RelatedRetailerID
FROM Retailer_Relations 
ORDER BY
RetailerID,
RelationType;

इसके पीछे तर्क यह है कि दोनों इंडेक्स रिटेलरआईडी पर मांग सकते हैं, वह हिस्सा बदलने वाला नहीं है। लेकिन क्या होगा अगर रिलेशनटाइप पर अतिरिक्त फ़िल्टर / ऑर्डर लागू किया जाता है? यह क्लस्टर इंडेक्स में सभी जगह पर होगा, जिसके परिणामस्वरूप यह तीसरा मुख्य मूल्य होगा, दूसरा मुख्य मूल्य नहीं। और जैसा कि हम जानते हैं, यह NCI में दूसरा मुख्य मूल्य है।

ठीक है, लेकिन गैर-अनुक्रमित सूचकांक कब और कैसे क्वेरी में सुधार करेगा?

कुछ मामले हो सकते हैं:

  • यदि रिलेशनशिप बहुत सारे मानों को फ़िल्टर करता है, तो अवशिष्ट I / O अधिक हो सकता है, जिसके परिणामस्वरूप गैर-अनुक्रमित सूचकांक (क्वेरी # 1) की संभावित आवश्यकता हो सकती है।
  • दो स्तंभों पर आदेश देना (एक तरीका) होता है, और परिणाम बड़ा होता है (प्रश्न # 2)।
  • जैसा कि @AaronBertrand ने उल्लेख किया है: यदि NCI की तुलना में CI आकार का अंतर काफी मात्रा में है, तो NCI को जोड़ने से प्रश्नों द्वारा पढ़े गए पृष्ठ कम हो जाएंगे जो इससे लाभान्वित होते हैं।

NCI साइड नोट

एक साइड नोट के रूप में, अपने एनसीआई में सूची में शामिल करने के लिए प्रमुख स्तंभों को जोड़ना बिल्कुल आवश्यक नहीं है, क्योंकि सीआई कुंजी कॉलम स्वचालित रूप से सभी गैर-क्लस्टर इंडेक्स में शामिल हैं।

आप ऐसा करने का विकल्प चुन सकते हैं यदि आप सुनिश्चित नहीं हैं कि यदि क्लस्टर इंडेक्स समान रहेगा, और चाहते हैं कि कॉलम हमेशा शामिल रहे।

क्वेरी के बारे में, यदि आपने निष्पादन योजना को PasteThePlan के माध्यम से जोड़ा है तो हम क्वेरी को अनुक्रमित / सुधारने पर कुछ और जानकारी दे सकते हैं।


परिक्षण

तालिका बनाएं और कुछ पंक्तियाँ जोड़ें

CREATE TABLE Retailer_Relations (
    RetailerID int , 
    RelatedRetailerID int , 
    RelationType smallint, 
    CreatedOn datetime,
    CONSTRAINT PK_Retailer_Relations 
PRIMARY KEY CLUSTERED (
    RetailerID ASC, 
    RelatedRetailerID ASC, 
    RelationType ASC
    ) ON [PRIMARY])


    DECLARE @I Int = 1
    WHILE @I < 1000
    BEGIN
    INSERT INTO Retailer_Relations(RetailerID,RelatedRetailerID,RelationType,CreatedOn)
    VALUES(@I,@I,@I,GETDATE()
    )
    set @I += 1
    END

क्वेरी # 1

    SELECT  RelatedRetailerID
FROM Retailer_Relations 
WHERE
RetailerID = 5 AND
RelationType = 20;

इंडेक्स के बिना प्लान यहां

जबकि यह एक तलाश कर रहा है, यह रिटेलरआईडी पर एक तलाश कर रहा है। बाद में यह एक अवशिष्ट I / O जारी कर रहा है RelationType पर

सूचकांक जोड़ें

CREATE NONCLUSTERED INDEX IX_TEST
ON Retailer_Relations (
    RetailerID, 
    RelationType
    ) 
INCLUDE (
    RelatedRetailerID
    )

अवशिष्ट विधेय चला गया है, सब कुछ एक साधक में, दोनों स्तंभों पर होता है।

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

दूसरी क्वेरी के साथ, अतिरिक्त अनुक्रमणिका सहायकता और भी स्पष्ट हो जाती है:

SELECT  RelatedRetailerID
FROM Retailer_Relations 
ORDER BY
RetailerID,
RelationType;

अनुक्रमणिका के बिना, क्रमबद्ध ऑपरेटर के साथ योजना बनाएं:

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

इंडेक्स के साथ योजना, इंडेक्स का उपयोग करके सॉर्ट ऑपरेटर को हटा देता है

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


1
धन्यवाद रैंडी, मैं इसे उत्तर के रूप में चिह्नित करूंगा लेकिन सिर्फ यह पूछना चाहता हूं कि क्या आप कहते हैं कि मिसिंग इंडेक्स सुझाव अनुमानित निष्पादन योजना पर आधारित है? मैं यह पूछता हूं क्योंकि यह SS2016 में वास्तविक निष्पादन योजना में प्रदर्शित किया गया है।
फ्लेच

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