2010-03-17 10 views
6

मैं एक बड़ी मेज (> 50 मीटर पंक्तियों) है जो एक आईडी और टाइमस्टैम्प के साथ कुछ डेटा है के बीच है:PostgreSQL क्वेरी बढ़ाता है जहां डाटा दो तिथियों

id, timestamp, data1, ..., dataN 

... पर एक बहु-स्तंभ सूचकांक के साथ (id, timestamp)

SELECT * FROM mytable WHERE id = x AND timestamp BETWEEN y AND z 

यह वर्तमान में एक उच्च अंत पर 2 से अधिक मिनट लगते हैं:

मैं एक निश्चित आईडी जहां टाइमस्टैम्प दो तिथियों के बीच है, जो मैं वर्तमान में उपयोग कर कर रहा हूँ के साथ सभी पंक्तियों का चयन करने के लिए तालिका क्वेरी करने के लिए की जरूरत है मशीन (2x 3 जीएचजेड ड्यूल-कोर ज़ियोन डब्ल्यू/एचटी, 16 जीबी रैम, RAID 0 में 2 एक्स 1 टीबी ड्राइव 0) और मैं वास्तव में इसे तेज करना चाहता हूं।

मुझे this tip मिला है जो एक स्थानिक सूचकांक का उपयोग करने की सिफारिश करता है, लेकिन यह उदाहरण आईपी पते के लिए है। हालांकि, गति वृद्धि (436 से 3 एस) प्रभावशाली है।

मैं टाइमस्टैम्प के साथ इसका उपयोग कैसे कर सकता हूं?

+0

* उच्च अंत मशीन को परिभाषित करें? वास्तव में ... 50 मिलियन पंक्तियां अब आज के मानकों द्वारा एक बड़ी मेज है। * तो, तालिका में आईडी है - टाइमस्टैम्प कहां है? * क्या सूचकांक? गुम इंडेक्स प्लस क्रैपी हार्डवेयर (उच्च अंत + सामान्य डिस्क) उन परिणामों का कारण बन सकता है। – TomTom

+0

एचटी, 16 जीबी रैम इत्यादि के साथ दोहरी 3GHz ज़ीऑन ड्यूल-कोर इत्यादि। तालिका (आईडी, टाइमस्टैम्प) पर बहु-कॉलम इंडेक्स के साथ तालिका (आईडी, टाइमस्टैम्प, डेटा) है। – Roger

+1

किसी भी माध्यम से उच्च अंत नहीं .... espeically जैसा कि आप ..... डिस्क के बारे में कुछ भी नहीं कहते हैं, जो किसी भी डेटाबेस सर्वर के लिए महत्वपूर्ण हिस्सा हैं। सीपीयू, या रैम बहुत मोर इथेन। आपका डिस्क लेआउट क्या है? – TomTom

उत्तर

0

यकीन है कि सूचकांक TableID + TableTimestamp है, और आप की तरह एक प्रश्न कार्य करें:

SELECT 
    .... 
    FROM YourTable 
    WHERE TableID=..YourID.. 
     AND TableTimestamp>=..startrange.. 
     AND TableTimestamp<=..endrange.. 

अगर आप कहां में मेज के TableTimestamp स्तंभ के लिए काम करता है लागू होते हैं, आप पूरी तरह से सूचकांक का उपयोग करने में सक्षम नहीं होगा ।

यदि आप पहले से ही यह सब कर रहे हैं, तो आपका हार्डवेयर कार्य तक नहीं हो सकता है।

आप संस्करण 8.2 या बाद में उपयोग कर रहे हैं, तो आप की कोशिश करनी चाहिए:

WHERE (TableID, TableTimestamp) >= (..YourID.., ..startrange..) 
    and (TableID, TableTimestamp) <= (..YourID.., ..endrange..) 
6

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

where 'a' between A and B 

है कि नहीं:

where A between 'a' and 'b' 

date(column) पर सूचकांक का उपयोग करने के बजाय column इसे थोड़ा तेज कर सकता है।

+0

टिप का उल्लेख है कि यह समय के लिए उपयुक्त है, "स्थानिक अंतराल के साथ तेजी से अंतराल (समय या आईपी पते) खोज रहे हैं"? अन्य संकेत के लिए धन्यवाद। – Roger

+0

यह समय के लिए उपयुक्त है। लेकिन यह केवल तभी उपयुक्त है जब आपकी तालिका में अंतराल होते हैं (यानी दो कॉलम) और आप वहां एक मान की तलाश करते हैं। जब आप सिंगल कॉलम की तुलना अंतराल से नहीं करते हैं। –

+0

अहह, मैं देखता हूं। क्षमा करें, मैं एप्लिकेशन को गलत समझाऊंगा। – Roger

1

क्या आप EXPLAIN हमारे लिए पूछ सकते हैं? फिर हम जानते हैं कि डेटाबेस आपकी क्वेरी कैसे निष्पादित करता है। और विन्यास के बारे में क्या? Shared_buffers और work_mem के लिए सेटिंग्स क्या हैं? और आपने आखिरी वैक्यूम कब और (या आपका सिस्टम) कब किया? और आखिरी बात, आप किस ओएस और पीजीएसक्यूएल-संस्करण का उपयोग कर रहे हैं?

आप अद्भुत इंडेक्स बना सकते हैं लेकिन उचित सेटिंग्स के बिना, डेटाबेस उन्हें बहुत कुशल नहीं उपयोग कर सकता है।

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