जैसा कि रेमस कहता है कि यह आपके कार्यभार पर निर्भर करता है।
मैं हालांकि स्वीकृत उत्तर के एक भ्रामक पहलू को संबोधित करना चाहता हूं।
सूचकांक में सभी स्तंभों पर समानता खोज करने वाले प्रश्नों के लिए कोई महत्वपूर्ण अंतर नहीं है।
नीचे दो तालिकाएँ बनाई गई हैं और उन्हें समान डेटा के साथ पॉप्युलेट किया गया है। अंतर केवल इतना है कि किसी के पास कम से कम चयनात्मक और दूसरे से रिवर्स के लिए ऑर्डर की गई चाबियां हैं।
CREATE TABLE Table1(MostSelective char(800), SecondMost TINYINT, Least CHAR(1), Filler CHAR(4000) null);
CREATE TABLE Table2(MostSelective char(800), SecondMost TINYINT, Least CHAR(1), Filler CHAR(4000) null);
CREATE NONCLUSTERED INDEX MyINDX on Table1(MostSelective,SecondMost,Least);
CREATE NONCLUSTERED INDEX MyINDX2 on Table2(Least,SecondMost,MostSelective);
INSERT INTO Table1 (MostSelective, SecondMost, Least)
output inserted.* into Table2
SELECT TOP 26 REPLICATE(CHAR(number + 65),800), number/5, '~'
FROM master..spt_values
WHERE type = 'P' AND number >= 0
ORDER BY number;
अब दोनों टेबल के खिलाफ एक क्वेरी कर रहा है ...
SELECT *
FROM Table1
WHERE MostSelective = REPLICATE('P', 800)
AND SecondMost = 3
AND Least = '~';
SELECT *
FROM Table2
WHERE MostSelective = REPLICATE('P', 800)
AND SecondMost = 3
AND Least = '~';
... दोनों एक इंडेक्स फाइन का उपयोग करते हैं और दोनों को एक ही कीमत दी जाती है।
स्वीकृत उत्तर में ASCII कला वास्तव में नहीं है कि कैसे अनुक्रमित संरचित हैं। तालिका 1 के सूचकांक पृष्ठ नीचे दर्शाए गए हैं (पूर्ण आकार में खोलने के लिए छवि पर क्लिक करें)।
अनुक्रमणिका पृष्ठों में संपूर्ण कुंजी वाली पंक्तियाँ होती हैं (इस मामले में पंक्ति पहचानकर्ता के लिए वास्तव में एक अतिरिक्त कुंजी स्तंभ जोड़ा जाता है क्योंकि अनुक्रमणिका को अद्वितीय नहीं घोषित किया गया था, लेकिन इस बारे में आगे की जानकारी की उपेक्षा की जा सकती है )।
SQL सर्वर के ऊपर क्वेरी के लिए कॉलम की चयनात्मकता की परवाह नहीं करता है। यह रूट पेज की एक द्विआधारी खोज करता है और पता चलता है कि कुंजी (PPP...,3,~ )
है >=(JJJ...,1,~ )
और < (SSS...,3,~ )
इसलिए इसे पृष्ठ को पढ़ना चाहिए 1:118
। यह तब उस पृष्ठ पर मुख्य प्रविष्टियों की एक द्विआधारी खोज करता है और नीचे जाने के लिए पत्ती पृष्ठ का पता लगाता है।
चयनात्मकता के क्रम में अनुक्रमणिका को बदलना बाइनरी सर्च से या तो पृष्ठों की संख्या या अनुक्रमणिका की तलाश करने के लिए नेविगेट करने की आवश्यकता वाले संख्याओं की अपेक्षित संख्या को प्रभावित नहीं करता है। सबसे अच्छी तरह से यह महत्वपूर्ण तुलना की तुलना में मामूली गति कर सकता है।
कभी-कभी सबसे अधिक चयनात्मक सूचकांक का आदेश देने से आपके कार्यभार में अन्य प्रश्नों के लिए समझ में आएगा।
उदाहरण के लिए, यदि कार्यभार में निम्नलिखित दोनों रूपों के प्रश्न हैं।
SELECT * ... WHERE MostSelective = 'P'
SELECT * ...WHERE Least = '~'
ऊपर दिए गए इंडेक्स उनमें से किसी के लिए भी कवर नहीं कर रहे हैं। MostSelective
एक सीक और लुक्स के साथ एक योजना बनाने के लिए पर्याप्त चयनात्मक है, लेकिन इसके खिलाफ क्वेरी Least
नहीं है।
हालाँकि यह परिदृश्य (गैर-संकेंद्रित सूचकांक के प्रमुख स्तंभ के सबसेट पर गैर-आवरण सूचकांक की तलाश) क्वेरी का केवल एक संभावित वर्ग है जिसे सूचकांक द्वारा मदद की जा सकती है। यदि आप वास्तव में कभी भी MostSelective
अपने आप से या के संयोजन से नहीं MostSelective, SecondMost
खोजते हैं और हमेशा तीनों स्तंभों के संयोजन से खोज करते हैं तो यह सैद्धांतिक लाभ आपके लिए बेकार है।
इसके विपरीत प्रश्न
SELECT MostSelective,
SecondMost,
Least
FROM Table2
WHERE Least = '~'
ORDER BY SecondMost,
MostSelective
सामान्य रूप से निर्धारित एक के विपरीत क्रम होने से मदद मिलेगी - क्योंकि यह क्वेरी को कवर करता है, बूट करने के लिए वांछित क्रम में एक सीक और रिटर्न पंक्तियों का समर्थन कर सकता है।
तो यह सलाह का एक दोहराया दोहराया टुकड़ा है, लेकिन कम से कम यह अन्य प्रश्नों के संभावित लाभ के बारे में एक अनुमान है - और यह वास्तव में आपके कार्यभार को देखने के लिए कोई विकल्प नहीं है ।