आइए कुछ स्तंभों के साथ एक लाख पंक्तियों को एक अस्थायी तालिका में फेंकें:
CREATE TABLE #174860 (
PK INT NOT NULL,
COL1 INT NOT NULL,
COL2 INT NOT NULL,
PRIMARY KEY (PK)
);
INSERT INTO #174860 WITH (TABLOCK)
SELECT RN
, RN % 1000
, RN % 10000
FROM
(
SELECT TOP 1000000 ROW_NUMBER () OVER (ORDER BY (SELECT NULL)) RN
FROM master..spt_values v1,
master..spt_values v2
) t;
CREATE INDEX IX_174860_IX ON #174860 (COL1) INCLUDE (COL2);
यहां मेरे पास PK
कॉलम पर एक डिफ़ॉल्ट सूचकांक (डिफ़ॉल्ट रूप से) है । इसमें एक गैर-अनुक्रमित सूचकांक होता COL1
है जिसमें एक प्रमुख कॉलम होता है COL1
और इसमें शामिल होता है COL2
।
निम्नलिखित प्रश्न पर विचार करें:
SELECT *
FROM #174860
WHERE PK >= 15000 AND PK < 15005
AND COL2 = 5000;
यहाँ मैं उपयोग नहीं कर रहा हूँ BETWEEN
क्योंकि हारून बर्ट्रेंड इस प्रश्न के चारों ओर लटका हुआ है।
SQL सर्वर अनुकूलक को किस प्रकार क्वेरी करनी चाहिए? खैर, मुझे पता है कि फ़िल्टर पर PK
परिणाम पांच पंक्तियों के लिए सेट हो जाएगा। SQL सर्वर तालिका में सभी मिलियन पंक्तियों के माध्यम से पढ़ने के बजाय उन पांच पंक्तियों पर जाने के लिए संकुल सूचकांक का उपयोग कर सकता है। हालाँकि, क्लस्टर किए गए अनुक्रमणिका में केवल कुंजी स्तंभ के रूप में PK स्तंभ होता है। एक बार पंक्ति को मेमोरी में पढ़ने के बाद हमें फ़िल्टर को लागू करना होगा COL2
। यहाँ, PK
यह एक विधेय है और COL2
एक विधेय है।
एसक्यूएल सर्वर की तलाश में पांच पंक्तियों का उपयोग करता है जो विधेय का उपयोग करता है और आगे उन पांच पंक्तियों को सामान्य विधेय के साथ एक पंक्ति में कम करता है।
यदि मैं क्लस्टर इंडेक्स को अलग तरीके से परिभाषित करता हूं:
CREATE TABLE #174860 (
PK INT NOT NULL,
COL1 INT NOT NULL,
COL2 INT NOT NULL,
PRIMARY KEY (COL2, PK)
);
और उसी क्वेरी को चलाएं जिसके मुझे अलग-अलग परिणाम मिले:
इस स्थिति में, SQL सर्वर WHERE
क्लॉज में दोनों कॉलम का उपयोग कर सकता है । कुंजी स्तंभों का उपयोग करके तालिका से बिल्कुल एक पंक्ति पढ़ी जाती है।
एक और उदाहरण के लिए इस प्रश्न पर विचार करें:
SELECT *
FROM #174860
WHERE COL1 = 500
AND COL2 = 3545;
IX_174860_IX इंडेक्स एक कवरिंग इंडेक्स है क्योंकि इसमें क्वेरी के लिए आवश्यक सभी कॉलम होते हैं। हालाँकि, केवल COL1
एक कुंजी स्तंभ है। SQL सर्वर उस कॉलम के साथ 1000 पंक्तियों को मिलान COL1
मूल्य के साथ ढूंढ सकता है । यह COL2
स्तंभ पर उन पंक्तियों को आगे फ़िल्टर कर सकता है, अंतिम परिणाम को कम करने के लिए 0 पंक्तियों को सेट करें।