2011-03-05 18 views
90

बहुत ही सरल उदाहरण - एक मेज, एक सूचकांक, एक क्वेरी:पोस्टग्रेएसक्यूएल अनुक्रमित कॉलम पर अनुक्रमिक स्कैन क्यों करता है?

CREATE TABLE book 
(
    id bigserial NOT NULL, 
    "year" integer, 
    -- other columns... 
); 

CREATE INDEX book_year_idx ON book (year) 

EXPLAIN 
SELECT * 
    FROM book b 
    WHERE b.year > 2009 

मुझे देता है:

Seq Scan on book b (cost=0.00..25663.80 rows=105425 width=622) 
    Filter: (year > 2009) 

यह क्यों प्रदर्शन नहीं करता सूचकांक बजाय स्कैन? मुझे क्या याद आ रही है?

उत्तर

135

यदि चयन तालिका में सभी पंक्तियों के लगभग 5-10% से अधिक लौटाता है, तो अनुक्रमिक स्कैन इंडेक्स स्कैन की तुलना में बहुत तेज है।

ऐसा इसलिए है क्योंकि एक सूचकांक स्कैन के लिए कई प्रत्येक पंक्ति के लिए आईओ ऑपरेशंस (इंडेक्स में पंक्ति को देखें, फिर ढेर से पंक्ति पुनर्प्राप्त करें) की आवश्यकता होती है। जबकि अनुक्रमिक स्कैन को केवल प्रत्येक पंक्ति के लिए एक एकल आईओ की आवश्यकता होती है - या इससे भी कम क्योंकि डिस्क पर एक ब्लॉक (पृष्ठ) में एक से अधिक पंक्ति होती है, इसलिए एकल आईओ ऑपरेशन के साथ एक से अधिक पंक्तियां प्राप्त की जा सकती हैं।

Btw: इस रूप में अच्छी तरह अन्य डीबीएमएस के लिए सच है - "सूचकांक केवल स्कैन" एक तरफ ले जाया के रूप में कुछ अनुकूलन (लेकिन एक का चयन के लिए * यह अत्यधिक संभावना नहीं है इस तरह के डीबीएमएस एक के लिए जाना होगा "अनुक्रमणिका केवल स्कैन" क)

+6

5-10% कुछ विन्यास सेटिंग्स और डेटा के भंडारण पर भी निर्भर करता है। यह एक कठिन संख्या नहीं है। –

+4

@ फ्रैंक: यही कारण है कि मैंने "लगभग" कहा है :) लेकिन –

+0

को इंगित करने के लिए धन्यवाद दिलचस्प है, जो मेरे लिए कई चीजें बताता है :) दरअसल, जब मैं वर्ष> 2010 का चयन करता हूं तो यह इंडेक्स स्कैन करता है। धन्यवाद! – wajda

8

क्या आपने ANALYZE तालिका/डेटाबेस किया था? और statistics के बारे में क्या? जब वर्ष 200 9 में कई रिकॉर्ड होते हैं, तो अनुक्रमिक स्कैन इंडेक्स स्कैन की तुलना में तेज़ हो सकता है।

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