क्या पहले क्षेत्र पर प्रश्नों के लिए एक समग्र सूचकांक भी अच्छा है?


86

मान लीजिए कि मैं क्षेत्रों के साथ एक मेज करते हैं Aऔर B। मैं A+ पर नियमित प्रश्न बनाता हूं B, इसलिए मैंने एक समग्र सूचकांक बनाया (A,B)। क्या केवल क्वेरीज़ को Aसमग्र सूचकांक द्वारा पूरी तरह से अनुकूलित किया जाएगा?

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


मैंने इसके लिए एक छोटा सा परीक्षण स्थापित करने की कोशिश की। मेरे मामले में, हालांकि, दो-स्तंभ इंडेक्स का उपयोग केवल तब किया गया था जब मैंने एकल-कॉलम एक को गिरा दिया था, जो कि पहले एक बनाया गया था। यह दिलचस्प है कि अगर मैंने पहले दो-स्तंभ सूचकांक बनाया, तो प्रारंभिक योजना ने बिटमैप हीप स्कैन का उपयोग किया। यदि मैंने एक-कॉलम इंडेक्स बनाया है, तो क्वेरी (उपयोग किए गए इंडेक्स स्कैन) को चलाएं और नए बनाए गए इंडेक्स को छोड़ दें, दो कॉलम वाले इंडेक्स में शामिल प्लान को इंडेक्स स्कैन में बदल दिया गया है। SQLFiddle
dezso

@dezso दिलचस्प। प्रत्येक प्रश्न के लिए लागत कहाँ हैं?
लुसियानो

बिटमैप इंडेक्स स्कैन लागत: 107.98, 43 एमएस निष्पादन समय। सूचकांक एक-स्तंभ को स्कैन करता है: लागत 8.69, दो-स्तंभ: 43.69। निष्पादन का समय काफी भिन्न नहीं होता है (उतार-चढ़ाव दोनों के बीच के अंतर से बड़ा होता है)।
dezso

@ लुसियानो क्या आप explain analyzeऔर क्वेरी पाठ दिखा सकते हैं ?
क्रेग रिंगर

जवाबों:


88

यह निश्चित ही। हमने चर्चा की कि इस संबंधित प्रश्न के तहत महान विस्तार से:

अंतरिक्ष को गुणकों में आवंटित किया जाता है MAXALIGN, जो आमतौर पर 64-बिट OS पर 8 बाइट्स या 32-बिट OS पर 4 बाइट्स होता है। यदि आप निश्चित नहीं हैं, तो जांचें pg_controldata। यह डेटा प्रकार के अनुक्रमित स्तंभों पर निर्भर करता है (कुछ को संरेखण पैडिंग की आवश्यकता होती है) और वास्तविक सामग्री।

एक इंडेक्स, कहते हैं, दो integerकॉलम (प्रत्येक 4 बाइट्स) आमतौर पर केवल एक इंडेक्स जितना बड़ा होता है, जहां एक और 4 बाइट्स संरेखण पैडिंग खो जाते हैं।

ऐसे मामले में क्वेरी प्लानर के लिए इंडेक्स का उपयोग करने के लिए वास्तव में कोई नकारात्मक पहलू नहीं है (a,b)- सिर्फ एक इंडेक्स की तुलना में (a)। और यह आमतौर पर एक ही सूचकांक का उपयोग करने के लिए कई प्रश्नों के लिए बेहतर है। साझा करने पर इसके (या इसके कुछ हिस्सों) भाग (कैश) में रहने का मौका बढ़ता है।

यदि आप पहले से ही एक इंडेक्स को बनाए रखते हैं (a,b), तो इसका कोई मतलब नहीं है कि सिर्फ एक इंडेक्स बनाएं (a)- जब तक कि यह काफी छोटा न हो। वही बनाम के लिए सच नहीं है । उस पर अधिक के लिए पहली पंक्ति में लिंक का पालन करें।(b,a)(a)

विपरीत दिशा से आ रहा है, जब आपको उस पर एक अतिरिक्त सूचकांक की आवश्यकता होती है (a,b), तो एक मौजूदा सूचकांक को बस पर छोड़ने पर विचार करें (a)- यदि संभव हो तो। अक्सर संभव नहीं है क्योंकि यह एक पीके या UNIQUEबाधा का सूचकांक है । 11 के बाद से आप केवल क्लॉज के bसाथ बाधा परिभाषा में संलग्न होने के साथ दूर हो सकते हैं INCLUDEमैनुअल में विवरण।

या(b,a) केवल bइसके अतिरिक्त प्रश्नों को कवर करने के लिए नया इंडेक्स बनाएं । केवल समानता की स्थितियों के लिए btree अनुक्रमित में अनुक्रमणिका अभिव्यक्तियों का क्रम मायने नहीं रखता है। हालाँकि, यह श्रेणी की शर्तों को शामिल करते समय करता है। देख:

एक सूचकांक में अतिरिक्त स्तंभों को शामिल करने के लिए संभावित डाउनसाइड हैं , भले ही वह केवल अंतरिक्ष का उपयोग करता हो अन्यथा संरेखण पैडिंग में खो गया:

  • जब भी अतिरिक्त कॉलम अपडेट किया जाता है, तो इंडेक्स को अब अपडेट की भी आवश्यकता होती है, जो कि परिचालन लिखने और अधिक इंडेक्स ब्लोट बनाने के लिए लागत जोड़ सकता है।
  • टेबल पर हॉट अपडेट (हीप ओनली ट्यूपल) संभव नहीं है, जबकि कोई भी इंडेक्स कॉलम शामिल नहीं है।

HOT अपडेट्स पर अधिक:

वस्तु का आकार कैसे मापें:


1
क्या आप यह कहने के लिए इसका विस्तार कर सकते हैं कि, यदि मेरे पास कॉलम A पर एक इंडेक्स है, और एक कंपाउंड इंडेक्स (A, B) को जोड़ने की आवश्यकता है, तो इंडेक्स ए को गिरा दिया जाना चाहिए? यदि किसी इंडेक्स का पुन: उपयोग करने से कैशे की कार्यक्षमता में सुधार होता है, और (ए, बी) पूरी तरह से अनुकूलन करता है, ए, तो ऐसा लगता है कि ए अतिरिक्त स्थान पर अतिरिक्त इंडेक्स की तरह होगा और संभावित रूप से धीमी गति से नीचे की ओर
बढ़ेगा

1
@jvans: आम तौर पर सच है - उल्लेखनीय अपवादों और विकल्पों के साथ। मैंने इसका पता करने के लिए एक पैराग्राफ जोड़ा।
इरविन ब्रान्डसेट्टर

2

आपके प्रश्न के अनुसार आपके पास फ़ील्ड ए और बी के साथ एक तालिका है यदि आप अपनी क्वेरी है:

SELECT * FROM [YOUR TBL]
WHERE A='XXXX'

ऑप्टिमाइज़र ने रैंडम एक्सेस से बचने के लिए कम्पोजिट इंडेक्स को चुना!


-4

यह उस स्थिति में है जब आप अभी-अभी विधेय में पहली बार उपयोग करते हैं।

यदि आप कंपोजिट कुंजी के पहले कॉलम और कंपोजिट कुंजी के गैर-कुंजी कॉलम का उपयोग करते हैं तो यह स्कैन करेगा।

इसे चकमा देने के लिए आप बस इस तरह से डमी की भविष्यवाणी कर सकते हैं और फिर गैर-कुंजी कॉलम:

[ए, बी] आपका सूचकांक है, [सी] - एक और कॉलम

अनुक्रमणिका का उपयोग करने के लिए आप इस प्रकार लिखें:

SELECT
    A,B,C,D,E
FROM 
    test
WHERE
   A=1
AND
   B=B
AND 
   C=3

... यह डिफ़ॉल्ट रूप से संयुक्त सूचकांक का चयन क्यों करता है, यदि एकल ए सूचकांक उपलब्ध है?

यदि केवल एक या दो विधेयकों [ए] या [ए], [बी] के मामले में यह सूचकांक का उपयोग करेगा। यह [B], [A] या [A], [C] क्रम में इसका उपयोग नहीं करेगा। अतिरिक्त स्तंभ [C] के साथ सूचकांक का उपयोग करने में सक्षम होने के लिए, आपको [A], [B] और [C] के रूप में विधेय का आदेश देकर सूचकांक को लागू करने की आवश्यकता है।


2
आप वास्तव में क्या हासिल करते हैं B=B? मुझे लगता है कि आप कुछ भी नहीं हासिल तो मैं नीचे मतदान कर रहा हूँ कोई सबूत यह सिर्फ अनुकूलक द्वारा अनदेखा नहीं किया जाता अनुपस्थित
जैक डगलस

2
B=Bप्रभावी रूप से उसी के रूप में है B IS NOT NULL, जो के लिए अनकहा लगता है। निश्चित रूप से एक सूचकांक का उपयोग करने की आवश्यकता नहीं है (a,b)
इरविन ब्रान्डेसटेटर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.