तालिका 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;
अनुक्रमणिका के बिना, क्रमबद्ध ऑपरेटर के साथ योजना बनाएं:
इंडेक्स के साथ योजना, इंडेक्स का उपयोग करके सॉर्ट ऑपरेटर को हटा देता है