जैसा कि रेमस कहता है कि यह आपके वर्कलोड पर निर्भर करता है।
हालांकि मैं स्वीकार किए गए उत्तर के एक भ्रामक पहलू को संबोधित करना चाहता हूं।
इंडेक्स में सभी कॉलम पर समानता खोज करने वाले प्रश्नों के लिए कोई महत्वपूर्ण अंतर नहीं है।
नीचे दो टेबल बनाता है और उन्हें समान डेटा के साथ पॉप्युलेट करता है। केवल अंतर यह है कि किसी के पास सबसे कम से कम चुनिंदा और दूसरे रिवर्स से क्रमशः चाबियाँ हैं।
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 के लिए अनुक्रमणिका पृष्ठ नीचे दर्शाए गए हैं (पूर्ण आकार में खोलने के लिए छवि पर क्लिक करें)।
इंडेक्स पृष्ठों पूरे कुंजी (इस मामले में वहाँ वास्तव में एक अतिरिक्त कुंजी स्तंभ पंक्ति पहचानकर्ता के लिए संलग्न के रूप में सूचकांक अद्वितीय के रूप में घोषित नहीं किया गया था लेकिन वह further information about this can be found here अवहेलना किया जा सकता है) युक्त पंक्तियां हो सकती हैं।
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
रूप
इसके विपरीत प्रश्नों सामान्यतः एक निर्धारित के विपरीत क्रम होने से मदद की हो सकता है - के रूप में यह क्वेरी को शामिल किया गया, एक की तलाश और बूट करने के लिए वांछित क्रम में पंक्तियों रिटर्न समर्थन कर सकते हैं।
तो यह सलाह का एक बार दोहराया टुकड़ा है, लेकिन ज्यादा से ज्यादा यह अन्य प्रश्नों के संभावित लाभ के बारे में अनुमानी है - और यह वास्तव में अपने कार्यभार को देख का कोई विकल्प नहीं है।
उपरोक्त तस्वीर में, ध्यान रखें कि यदि सूचकांक क्वेरी में निर्दिष्ट किया गया था तो वह सूचकांक केवल फायदेमंद होगा। यदि आपकी क्वेरी केवल शामिल हों या खोज पूर्वानुमान में कॉलम 2 निर्दिष्ट करती है तो यह लाभकारी नहीं होगी। तो वहां भी मामला आदेश दें। शायद यह कहने के बिना चला जाता है, लेकिन इसका जिक्र करना चाहता था। – CodeCowboyOrg
यह भी ध्यान रखें, मान लीजिए कि आपका इंडेक्स उपरोक्त चित्र की तरह है, और आपकी क्वेरी कॉलम 1 और कॉलम 2 पर फ़िल्टर करती है, लेकिन कॉलम 2 अधिक अनूठा है और आप वास्तव में क्या फ़िल्टर करना चाहते हैं वास्तव में कॉलम 2 है, तो इसके लिए केवल एक इंडेक्स होना फायदेमंद है जहां कॉलम 2 पहले है। यह counterintuitive प्रतीत हो सकता है लेकिन ध्यान रखें कि एक सूचकांक कई पृष्ठों पर संग्रहीत है और मूल्यों की एक श्रृंखला के साथ एक पेड़ है, जबकि ऊपर स्तंभ 1 1 संभावनाओं को अस्वीकार करता है, सूचकांक पहले से ही जानता है कि कौन सा इंडेक्स पेज सीधे जाना है कॉलम 2 मान, सेट को कम करने के लिए कॉलम 1 की आवश्यकता नहीं है। – CodeCowboyOrg
यह तस्वीर सटीक प्रतिनिधित्व नहीं है कि इंडेक्स कैसे संरचित या नेविगेट किए जाते हैं। इस http://stackoverflow.com/a/39080819/73226 –