2010-11-19 13 views
5
  • मेरे पास एक बहुत बड़ी तालिका है।
  • मेरे पास कॉलम col1 पर एक अनुक्रमणिका है।
  • मैं col1 द्वारा आदेशित डेटा प्राप्त करना चाहता हूं।
  • क्वेरी प्लान से मैं कह सकता हूं कि यह इंडेक्स का उपयोग नहीं करता है।
  • जब मैं "LIMIT" जोड़ता हूं, तो यह सूचकांक
  • का उपयोग करना शुरू करता है "LIMIT" के लिए बड़े मूल्य के लिए, यह अनुक्रमणिका का उपयोग बंद कर देता है।

कोई सुराग?पोस्टग्रेस "ORDER BY" के साथ इंडेक्स का उपयोग नहीं करता है

पीएस मैं "ऑर्डर बाय" के अलावा किसी भी सुझाव, col1 (आवश्यक रूप से क्रमबद्ध नहीं) के मूल्यों से क्लस्टर डेटा प्राप्त करना चाहता हूं।

धन्यवाद !!

+2

EXPLAIN विश्लेषण से परिणाम कहां है? इसके बिना, किसी के पास कोई सुराग नहीं है कि चीजें क्यों काम नहीं कर रही हैं जैसा आप सोचेंगे। –

उत्तर

5

यदि आपकी तालिका में सभी पंक्तियां वापस आती हैं तो एक इंडेक्स स्कैन टेबल स्कैन से धीमा हो जाएगा। आपको क्यों लगता है कि आपको इंडेक्स उपयोग की आवश्यकता है?

आप अनुक्रमिक स्कैन को निष्क्रिय करने के क्रम में

set enable_seqscan = false

उपयोग करने के लिए कोशिश कर सकते हैं, लेकिन मुझे यकीन है कि अनुक्रमिक स्कैन के साथ की तुलना में धीमी हो जाएगा हूँ।

ORDER BY केवल आपके डेटा को सॉर्ट करने के लिए विधि है। किसी भी अन्य छँटाई आप देख सकते हैं शुद्ध संयोग

संपादित
चीजों को साफ़ करने के लिए है: मैं नहीं seq बंद स्कैन करने की सलाह देते हैं करते हैं। मैंने इसे यह दिखाने के लिए एक तरीका के रूप में पोस्ट किया है कि सीक स्कैन इंडेक्स स्कैन की तुलना में वास्तव में तेज़ है। एक बार इंडेक्स स्कैन का उपयोग करके निष्पादन योजना को बंद कर दिया जाएगा, शायद एसपी स्कैन से धीमा हो जाएगा जो ओपी दिखा रहा है कि इंडेक्स स्कैन की कोई आवश्यकता नहीं है।

+0

मान लीजिए कि यह एक कुंजी-> मान तालिका है। मैं सभी पंक्तियों को वापस करना चाहता हूं लेकिन परिणाम सेट में एक ही कुंजी रखने वाले रिकॉर्ड लगातार होना चाहिए, लेकिन सॉर्टिंग वास्तव में कोई फर्क नहीं पड़ता। –

+3

फिर "akeyer by the_key_column" खंड जोड़ें। यह आपके डेटा को सॉर्ट करने के लिए * केवल * विश्वसनीय तरीका है –

+0

enable_seqscan बंद करने के लिए बहुत बुरा विचार है, यह वास्तविक समस्या को हल नहीं करता है। –

4

a_horse_with_no_name के जवाब के अलावा: सबसे पहले मूल्य इच्छा सूचकांक में लिए देखा जाता है:

एक सूचकांक का उपयोग वास्तव में दो अलग-अलग कार्यों के लिए है। इंडेक्स में पूर्ण रिकॉर्ड का पता है जिसे तब संदर्भित किया जाता है। दोनों परिचालन विशिष्ट प्रश्नों के लिए बहुत तेज़ हैं।

यदि आप सभी या अधिकतर रिकॉर्डों का उपयोग करना चाहते हैं, तो लाभ दूर हो जाता है। यदि आप सभी रिकॉर्ड चाहते हैं और आप इंडेक्स के माध्यम से जाते हैं, तो इसमें अधिक समय लगता है क्योंकि प्रत्येक रिकॉर्ड के लिए दो तलाश होती हैं। सूचकांक के बिना पूरी तालिका को चलाने के लिए आसान है क्योंकि यह प्रति कॉलम की तलाश करता है (हाँ, मुझे पता है, वास्तव में यह उससे कम है क्योंकि पूरे ब्लॉक पढ़े जाते हैं ... मैं बस इसे सरल रखना चाहता हूं)।

+0

लेकिन इंडेक्स का उपयोग सॉर्टिंग समय बचाता है, मुझे लगता है। –

+0

नहीं और यह संपूर्ण स्पष्टीकरण क्यों नहीं है। –

+3

इसी तरह के स्पष्टीकरण के लिए मैन्युअल के ["इंडेक्स और ऑर्डर बाय"] (http://www.postgresql.org/docs/current/static/indexes-ordering.html) अनुभाग को भी पढ़ें। –