2013-01-31 9 views
7

में एरैटिक अनुक्रमित क्वेरी प्रदर्शन PostgreSQL में किसी क्वेरी के प्रदर्शन के संबंध में सहायता चाहिए। ऐसा लगता है कि इंडेक्स से संबंधित है।PostgreSQL

इस क्वेरी:

SELECT * FROM the_table WHERE type = 'some_type' ORDER BY timestamp LIMIT 20

इंडेक्स:

CREATE INDEX the_table_timestamp_index ON the_table(timestamp); 

CREATE INDEX the_table_type_index ON the_table(type); 
द्वारा type
  • आदेश, आरोही के अनुसार

    • फिल्टर

      type फ़ील्ड के मान केवल 11 अलग-अलग तारों में से एक हैं।
      समस्या यह है कि क्वेरी O (लॉग n) समय में निष्पादित प्रतीत होती है, type के कुछ मानों को छोड़कर, केवल कुछ मिलीसेकंड लेते समय, जो कई मिनटों को चलाने के क्रम में लेते हैं।

      इन उदाहरण प्रश्नों में प्रथम, द्वितीय 30 से अधिक मिनट लगते हैं, जबकि चलाने के लिए केवल कुछ ही मिलीसेकेंड लेता है:

      SELECT * FROM the_table WHERE type = 'goq' ORDER BY timestamp LIMIT 20 
      SELECT * FROM the_table WHERE type = 'csp' ORDER BY timestamp LIMIT 20 
      

      मैं बारे में 90% निश्चितता के साथ संदेह है, कि अनुक्रमित हमारे पास नहीं हैं सही लोग मुझे लगता है, this similar question about index performance पढ़ने के बाद, सबसे अधिक संभावना है कि हमें एक समग्र इंडेक्स है, type और timestamp पर।

      क्वेरी की योजना बना रही है कि मैं चलाने यहां हैं:

      1. Expected performance, type-specific index (i.e. new index with the type = 'csq' in the WHERE clause)। आपकी मदद के लिए बहुत बहुत
      2. Slowest, problematic case, indexes as described above.
      3. Fast case, same indexes as above.

      धन्यवाद! किसी भी संकेतक वास्तव में सराहना की जाएगी!

  • +0

    इंडेक्स का आकार क्या है? और डेटासेट का आकार? – Gothmog

    उत्तर

    2

    इंडेक्स का उपयोग where खंड या order by खंड के लिए किया जा सकता है। सूचकांक thetable(type, timestamp) के साथ, फिर दोनों के लिए एक ही सूचकांक का उपयोग किया जा सकता है।

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

    यह सिर्फ एक अनुमान है, लेकिन यह देखने के लिए उपर्युक्त अनुक्रमणिका बनाने योग्य है कि यह प्रदर्शन समस्याओं को हल करता है या नहीं।

    +0

    धन्यवाद! कोशिश करेंगे :) –

    2

    समझाएँ आउटपुट सभी टाइमस्टैम्प इंडेक्स का उपयोग करते हैं। ऐसा शायद इसलिए है क्योंकि प्रकार कॉलम की कार्डिनालिटी बहुत कम है इसलिए उस कॉलम पर एक इंडेक्स पर एक स्कैन टेबल स्कैन के रूप में महंगा है।

    समग्र सूचकांक होना चाहिए बनाया जाना:

    create index comp_index on the_table ("timestamp", type) 
    

    कि आदेश में।

    +0

    बहुत बढ़िया! तो सूचकांक में कॉलम के आदेश के साथ एक अंतर है? –

    +0

    @ जुआन कार्लोसकोटो। । । वास्तव में, आदेश एक फर्क पड़ता है। पहले 'टाइमस्टैम्प' डालने से, इंजन 'कहां' खंड के लिए सूचकांक का उपयोग नहीं कर सकता है। विभिन्न प्रकार सूचकांक में बिखरे हुए होंगे। –