सीक प्रेडीकेट और प्रेडिकेट के बीच अंतर


12

मैं SQL सर्वर 2014 एंटरप्राइज में हमारे पास मौजूद क्वेरी को ट्यून करने की कोशिश कर रहा हूं।

मैं एसक्यूएल संतरी योजना Explorer में वास्तविक क्वेरी योजना खोला है और मैं एक नोड पर देख सकते हैं कि यह एक है शोध विधेय एक है और यह भी विधेय

सीक प्रेडीकेट और प्रेडिकेट के बीच अंतर क्या है ?

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

नोट: मैं देख सकता हूं कि इस नोड के साथ बहुत सारी समस्याएं हैं (जैसे कि अनुमानित बनाम वास्तविक पंक्तियाँ, अवशिष्ट IO), लेकिन सवाल उस किसी से संबंधित नहीं है।


3
तलाश में शामिल होने के साथ सहायता करना, केवल उन पंक्तियों को फ़िल्टर करना जो अन्य तालिका में भी पाई जाती हैं (जिसे आपने नया स्वरूप दिया है)। विधेय (एक अवशिष्ट विधेय) तो विशिष्ट 2. की स्थिति के साथ पंक्तियों को समाप्त
हारून बर्ट्रेंड

5
रॉब फ़र्ले ने एक टिप्पणी में यहाँ कहा है :The Seek Predicate can be used to find the start of the RangeScan and then when to stop, while the Predicate is the "check" that is applied to every row in the Range.
हारून बर्ट्रेंड

जवाबों:


18

आइए कुछ स्तंभों के साथ एक लाख पंक्तियों को एक अस्थायी तालिका में फेंकें:

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 पंक्तियों को सेट करें।

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

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