2010-02-18 14 views
105

मैंने सुना है कि आपको कॉलम रखना चाहिए जो इंडेक्स घोषणा की शुरुआत में सबसे चुनिंदा होगा। उदाहरण:इंडेक्स में कॉलम का क्रम कितना महत्वपूर्ण है?

CREATE NONCLUSTERED INDEX MyINDX on Table1 
(
    MostSelective, 
    SecondMost, 
    Least 
) 

सबसे पहले, क्या मैं सही कह रहा हूं? यदि हां, तो क्या मुझे अपने सूचकांक में कॉलम के क्रम को पुनर्व्यवस्थित करके प्रदर्शन में बड़े अंतर देखने की संभावना है या क्या यह "अच्छा करने के लिए" अभ्यास से अधिक है?

कारण मैं पूछ रहा हूं क्योंकि डीटीए के माध्यम से एक प्रश्न डालने के बाद यह सिफारिश की गई है कि मैं एक इंडेक्स तैयार करता हूं जिसमें मौजूदा सूचकांक के रूप में लगभग सभी कॉलम होते हैं, बस एक अलग क्रम में। मैं सिर्फ मौजूदा इंडेक्स में लापता कॉलम जोड़ने और इसे अच्छा कहने पर विचार कर रहा था। विचार?

उत्तर

135

इस तरह एक सूचकांक पर देखो: कैसे एक पहला पर सीमित

Cols 
    1 2 3 
------------- 
| | 1 | | 
| A |---| | 
| | 2 | | 
|---|---| | 
| | | | 
| | 1 | 9 | 
| B | | | 
| |---| | 
| | 2 | | 
| |---| | 
| | 3 | | 
|---|---| | 

के रूप में अपने पहले कॉलम पहले अपने दूसरे स्तंभ पर सीमित की तुलना में अधिक परिणाम समाप्त देखें,? यदि आप चित्रित करते हैं कि इंडेक्स को कैसे कॉल किया जाना चाहिए, कॉलम 1, फिर कॉलम 2, आदि ... आप देखते हैं कि मुट्ठी पास में अधिकांश परिणामों को बंद करना दूसरा कदम इतना तेज़ बनाता है।

एक और मामला, यदि आपने कॉलम 3 पर पूछताछ की है, तो अनुकूलक इंडेक्स का भी उपयोग नहीं करेगा, क्योंकि परिणाम सेट को कम करने में यह सहायक नहीं है। जब भी आप किसी प्रश्न में हों, तो अगले चरण से पहले निपटने के लिए परिणामों की संख्या को कम करने का अर्थ बेहतर प्रदर्शन है।

चूंकि इंडेक्स भी इस तरह से संग्रहीत किया जाता है, इसलिए जब आप उस पर पूछताछ करते हैं तो पहले कॉलम को खोजने के लिए इंडेक्स में कोई बैकट्रैकिंग नहीं होती है।

संक्षेप में: नहीं, यह शो के लिए नहीं है, वास्तविक प्रदर्शन लाभ हैं।

+2

उपरोक्त तस्वीर में, ध्यान रखें कि यदि सूचकांक क्वेरी में निर्दिष्ट किया गया था तो वह सूचकांक केवल फायदेमंद होगा। यदि आपकी क्वेरी केवल शामिल हों या खोज पूर्वानुमान में कॉलम 2 निर्दिष्ट करती है तो यह लाभकारी नहीं होगी। तो वहां भी मामला आदेश दें। शायद यह कहने के बिना चला जाता है, लेकिन इसका जिक्र करना चाहता था। – CodeCowboyOrg

+0

यह भी ध्यान रखें, मान लीजिए कि आपका इंडेक्स उपरोक्त चित्र की तरह है, और आपकी क्वेरी कॉलम 1 और कॉलम 2 पर फ़िल्टर करती है, लेकिन कॉलम 2 अधिक अनूठा है और आप वास्तव में क्या फ़िल्टर करना चाहते हैं वास्तव में कॉलम 2 है, तो इसके लिए केवल एक इंडेक्स होना फायदेमंद है जहां कॉलम 2 पहले है। यह counterintuitive प्रतीत हो सकता है लेकिन ध्यान रखें कि एक सूचकांक कई पृष्ठों पर संग्रहीत है और मूल्यों की एक श्रृंखला के साथ एक पेड़ है, जबकि ऊपर स्तंभ 1 1 संभावनाओं को अस्वीकार करता है, सूचकांक पहले से ही जानता है कि कौन सा इंडेक्स पेज सीधे जाना है कॉलम 2 मान, सेट को कम करने के लिए कॉलम 1 की आवश्यकता नहीं है। – CodeCowboyOrg

+1

यह तस्वीर सटीक प्रतिनिधित्व नहीं है कि इंडेक्स कैसे संरचित या नेविगेट किए जाते हैं। इस http://stackoverflow.com/a/39080819/73226 –

26

आपको कॉलम रखना चाहिए जो इंडेक्स घोषणा की शुरुआत में सबसे चुनिंदा होगा।

सही। इंडेक्स कंपोजिट्स हो सकते हैं - एकाधिक कॉलम से बना है - और शेष सिद्धांत के कारण ऑर्डर महत्वपूर्ण है। कारण यह है कि डेटाबेस सूची को बाएं से दाएं से जांचता है, और परिभाषित क्रम से मेल खाने वाले संबंधित कॉलम संदर्भ को ढूंढना होता है। उदाहरण के लिए, कॉलम के साथ एक पते की मेज पर एक सूचकांक होने:

  • पता
  • शहर
  • राज्य

address स्तंभ का उपयोग सूचकांक का उपयोग कर सकते ऐसा कोई भी क्वेरी, लेकिन क्वेरी अगर केवल या तो city और/या state संदर्भ हैं - अनुक्रमणिका का उपयोग नहीं किया जा सकता है। ऐसा इसलिए है क्योंकि बाएं कॉलम का संदर्भ नहीं दिया जाता है। क्वेरी प्रदर्शन आपको बताएगा कि कौन सा इष्टतम है - व्यक्तिगत इंडेक्स, या विभिन्न ऑर्डर के साथ कई कंपोजिट्स। अच्छा पढ़ने: The Tipping Point, किम्बरली ट्रिप द्वारा

+0

क्या होगा यदि यह केवल सही स्तंभ था जिसका उपयोग नहीं किया जा रहा था? तो एक प्रश्न पता और शहर का इस्तेमाल किया, लेकिन राज्य नहीं। तब सूचकांक का उपयोग किया जाएगा? –

+0

@Abe: लगभग उपयोग नहीं किया जाएगा - आपको बाएं से शुरू होने वाले इंडेक्स ऑर्डर को संतुष्ट करना होगा। मिस एक, इसका इस्तेमाल नहीं कर सकता। –

+2

@ एबे: यदि आपने पता और शहर पर पूछताछ की है, लेकिन राज्य नहीं - तो हाँ, सूचकांक का उपयोग किया जाएगा।दूसरे शब्दों में, डेटाबेस एक अनुरोध को पूरा करने के लिए आंशिक अनुक्रमणिका का उपयोग करने में सक्षम है, जब तक कि यह एक इंडेक्स के बाईं ओर से शुरू करने में सक्षम हो और पूछे जाने वाले फ़ील्ड का उपयोग करने के दाएं स्थान पर जा सके। यदि, हालांकि, आपने पता और राज्य का उपयोग करके पूछताछ की है, लेकिन शहर नहीं है, तो यह अभी भी सूचकांक का उपयोग कर सकता है, लेकिन यह उतना कुशल नहीं होगा - क्योंकि अब यह केवल सूचकांक के पता भाग का उपयोग करने में सक्षम है (बी/सी अगला है शहर और इसका उपयोग क्वेरी में नहीं किया जा रहा है)। – JaredC

95

कॉलम का क्रम महत्वपूर्ण है। अब कौन सा ऑर्डर सही है यह इस बात पर निर्भर करता है कि आप इसे कैसे पूछेंगे। सटीक खोज या रेंज स्कैन करने के लिए एक इंडेक्स का उपयोग किया जा सकता है। एक सटीक खोज तब होती है जब इंडेक्स में सभी कॉलम के मान निर्दिष्ट होते हैं और क्वेरी पर बिल्कुल पूछे जाने वाले प्रश्नों में दिलचस्पी है। कॉलम का क्रम अप्रासंगिक है।एक श्रेणी स्कैन तब होता है जब केवल कुछ कॉलम निर्दिष्ट होते हैं, और इस मामले में जब आदेश महत्वपूर्ण हो जाता है। एसक्यूएल सर्वर केवल रेंज स्कैन के लिए एक इंडेक्स का उपयोग कर सकता है अगर बाएं कॉलम निर्दिष्ट किया गया हो, और तब तभी जब अगला बाएं कॉलम निर्दिष्ट किया गया हो, और इसी तरह। आप पर (ए, बी, सी) एक सूचकांक है, तो यह [email protected] के लिए स्कैन लेकर, के लिए [email protected] AND [email protected] लेकिन नहीं[email protected] के लिए, [email protected] और न ही [email protected] AND [email protected] के लिए इस्तेमाल किया जा सकता है। [email protected] AND [email protected] 0 मिश्रित है, क्योंकि [email protected] भाग में इंडेक्स का उपयोग किया जाएगा, लेकिन [email protected] नहीं (क्वेरी [email protected] के लिए सभी बी मान स्कैन करेगी, [email protected] पर 'छोड़ेंगी')। अन्य डेटाबेस सिस्टमों में तथाकथित 'स्किप स्कैन' ऑपरेटर होता है जो बाहरी कॉलम निर्दिष्ट नहीं होने पर इंडेक्स में आंतरिक कॉलम का कुछ लाभ ले सकता है।

उस ज्ञान के साथ आप सूचकांक परिभाषाओं को फिर से देख सकते हैं। (MostSelective, SecondMost, Least) पर एक सूचकांक तब प्रभावी होगा जब MostSelective कॉलम निर्दिष्ट किया गया है। लेकिन यह सबसे चुनिंदा होने के नाते, आंतरिक कॉलम की प्रासंगिकता जल्द ही खराब हो जाएगी। अक्सर आप पाएंगे कि एक बेहतर सूचकांक (MostSelective) include (SecondMost, Least) पर या (MostSelective, SecondMost) include (Least) पर है। चूंकि आंतरिक कॉलम कम प्रासंगिक होते हैं, इसलिए इंडेक्स में ऐसी सही स्थिति में कम चयनशीलता कॉलम रखने से उन्हें किसी भी खोज के लिए शोर नहीं होता है, इसलिए उन्हें मध्यवर्ती पृष्ठों से बाहर ले जाने और उन्हें केवल पत्ते पृष्ठों पर रखने का अर्थ होता है, क्योंकि क्वेरी कवरिबिलिटी उद्देश्यों। दूसरे शब्दों में, उन्हें शामिल करने के लिए ले जाएं। Least कॉलम बढ़ने के आकार के रूप में यह अधिक महत्वपूर्ण हो जाता है। विचार यह है कि यह सूचकांक केवल उन प्रश्नों का लाभ उठा सकता है जो MostSelective या तो सटीक मान या सीमा के रूप में निर्दिष्ट करते हैं, और यह कॉलम सबसे चुनिंदा है, यह उम्मीदवारों की पंक्तियों को काफी हद तक प्रतिबंधित करता है।

दूसरी तरफ (Least, SecondMost, MostSelective) पर एक सूचकांक एक गलती प्रतीत हो सकती है, लेकिन यह वास्तव में काफी शक्तिशाली सूचकांक है। चूंकि इसमें Least कॉलम है जो इसकी बाहरी क्वेरी के रूप में है, इसका उपयोग उन प्रश्नों के लिए किया जा सकता है जिन्हें कम चयनशीलता कॉलम पर परिणाम एकत्र करना होगा। ओएलएपी और विश्लेषण डेटा वेयरहाउस में ऐसे प्रश्न प्रचलित हैं, और यह वही है जहां ऐसी इंडेक्स के लिए उनके लिए बहुत अच्छा मामला है। इस तरह के इंडेक्स वास्तव में उत्कृष्ट क्लस्टर्ड इंडेक्स बनाते हैं, ठीक है क्योंकि वे संबंधित पंक्तियों के बड़े हिस्से (उसी Least मान, जो आमतौर पर किसी प्रकार की श्रेणी या प्रकार इंगित करते हैं) पर भौतिक लेआउट व्यवस्थित करते हैं और वे विश्लेषण प्रश्नों की सुविधा प्रदान करते हैं।

तो, दुर्भाग्यवश, कोई 'सही' आदेश नहीं है। आपको किसी भी कुकी कटर रेसिपी का पालन नहीं करना चाहिए बल्कि इसके बजाय उन क्वेरी पैटर्न का विश्लेषण करना है जिन्हें आप उन तालिकाओं के खिलाफ उपयोग करने जा रहे हैं और तय करें कि कौन सा इंडेक्स कॉलम ऑर्डर सही है।

+2

सामान्य रीमस के रूप में बहुत बढ़िया प्रतिक्रिया। मैं आपके तीसरे पैराग्राफ को कुछ और बार पढ़ने और अनुवर्ती करने जा रहा हूं। मुझे संदेह है कि मुझे वही होना चाहिए जो मुझे करने की ज़रूरत है। –

+0

स्किप स्कैन के बारे में माइक्रोसॉफ्ट कनेक्ट आइटम: https://connect.microsoft.com/SQLServer/feedback/details/695044/implement-index-skip-scan – usr

+0

* "SQL सर्वर केवल एक रेंज स्कैन के लिए एक इंडेक्स का उपयोग कर सकता है यदि बाएं कॉलम निर्दिष्ट किया गया है, और उसके बाद केवल तभी अगला बाएं कॉलम निर्दिष्ट किया गया है, और इसी तरह। "* यह मेरी समझ से बिल्कुल याद नहीं था, धन्यवाद! मुझे नहीं पता था कि रेंज स्कैन केवल सही इस्तेमाल किए गए इंडेक्स कॉलम पर ही किए जा सकते हैं, लेकिन अब जब मैं ऐसा करता हूं तो यह बहुत समझ में आता है। –

19

जैसा कि रेमस कहता है कि यह आपके वर्कलोड पर निर्भर करता है।

हालांकि मैं स्वीकार किए गए उत्तर के एक भ्रामक पहलू को संबोधित करना चाहता हूं।

इंडेक्स में सभी कॉलम पर समानता खोज करने वाले प्रश्नों के लिए कोई महत्वपूर्ण अंतर नहीं है।

नीचे दो टेबल बनाता है और उन्हें समान डेटा के साथ पॉप्युलेट करता है। केवल अंतर यह है कि किसी के पास सबसे कम से कम चुनिंदा और दूसरे रिवर्स से क्रमशः चाबियाँ हैं।

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 = '~'; 

... उन दोनों एक सूचकांक ठीक का उपयोग करें और दोनों में ठीक उसी लागत दिया जाता है।

enter image description here

स्वीकार किए जाते हैं जवाब में ASCII आर्ट तथ्य कैसे अनुक्रमित संरचित कर रहे में नहीं है। तालिका 1 के लिए अनुक्रमणिका पृष्ठ नीचे दर्शाए गए हैं (पूर्ण आकार में खोलने के लिए छवि पर क्लिक करें)।

enter image description here

इंडेक्स पृष्ठों पूरे कुंजी (इस मामले में वहाँ वास्तव में एक अतिरिक्त कुंजी स्तंभ पंक्ति पहचानकर्ता के लिए संलग्न के रूप में सूचकांक अद्वितीय के रूप में घोषित नहीं किया गया था लेकिन वह 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 

रूप

इसके विपरीत प्रश्नों सामान्यतः एक निर्धारित के विपरीत क्रम होने से मदद की हो सकता है - के रूप में यह क्वेरी को शामिल किया गया, एक की तलाश और बूट करने के लिए वांछित क्रम में पंक्तियों रिटर्न समर्थन कर सकते हैं।

तो यह सलाह का एक बार दोहराया टुकड़ा है, लेकिन ज्यादा से ज्यादा यह अन्य प्रश्नों के संभावित लाभ के बारे में अनुमानी है - और यह वास्तव में अपने कार्यभार को देख का कोई विकल्प नहीं है।

संबंधित मुद्दे