किसी प्रश्न को कैसे `` क्षेत्र के साथ अनुक्रमित करें ''?


14

मेरे पास बहुत से आवेषण के साथ एक तालिका है, जिसमें से एक फ़ील्ड ( uploaded_at) को सेट करना है NULL। फिर एक आवधिक कार्य सभी टुपल्स का चयन करता है WHERE uploaded_at IS NULL, उन्हें संसाधित करता है और अपडेट करता है, uploaded_atवर्तमान तिथि पर सेट करता है।

मुझे तालिका को कैसे अनुक्रमित करना चाहिए?

मैं समझता हूं कि मुझे एक आंशिक सूचकांक का उपयोग करना चाहिए जैसे:

CREATE INDEX foo ON table (uploaded_at) WHERE uploaded_at IS NULL

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

मैंने निम्नलिखित सूचकांकों के साथ थोड़ा प्रयोग किया है:

"foo_part" btree (uploaded_at) WHERE uploaded_at IS NULL
"foo_part_id" btree (id) WHERE uploaded_at IS NULL

और क्वेरी प्लानर हमेशा foo_partसूचकांक का चयन करता है । सूचकांक के explain analyseलिए भी थोड़ा बेहतर परिणाम देता है foo_part:

Index Scan using foo_part on t1  (cost=0.28..297.25 rows=4433 width=16) (actual time=0.025..3.649 rows=4351 loops=1)
   Index Cond: (uploaded_at IS NULL)
 Total runtime: 4.060 ms

बनाम

Bitmap Heap Scan on t1  (cost=79.15..6722.83 rows=4433 width=16) (actual time=1.032..4.717 rows=4351 loops=1)
   Recheck Cond: (uploaded_at IS NULL)
   ->  Bitmap Index Scan on foo_part_id  (cost=0.00..78.04 rows=4433 width=0) (actual time=0.649..0.649 rows=4351 loops=1)
 Total runtime: 5.131 ms

जवाबों:


10

इस विशेष मामले में वास्तव में अनुक्रमित स्तंभ हाथ में क्वेरी के लिए अप्रासंगिक है। आप कोई भी कॉलम चुन सकते हैं। मैं कुछ और चुनूंगा uploaded_at, जो बेकार है। कुछ कॉलम जो अन्य प्रश्नों के लिए उपयोगी हो सकते हैं और आदर्श रूप से 8 बाइट्स से बड़े नहीं हैं।

CREATE INDEX foo ON table bar (some_col) WHERE uploaded_at IS NULL;

यदि आपके पास किसी अन्य कॉलम के लिए कोई उपयोग मामला uploaded_atनहीं है, तो बेकार के साथ रहना अभी भी सबसे अच्छा है , इसलिए सूचकांक के लिए अतिरिक्त रखरखाव लागत और HOT अपडेट के लिए प्रतिबंधों को लागू नहीं करना है। अधिक:

या यदि आप किसी अन्य इंडेक्स कॉलम के लिए कोई उपयोग नहीं करते हैं, तो इंडेक्स एक्सप्रेशन के रूप में एक निरंतर का उपयोग करें। पसंद:

CREATE INDEX baz ON table bar ((TRUE)) WHERE uploaded_at IS NULL;

कोष्ठक की आवश्यकता है। इससे सूचकांक भी न्यूनतम आकार में रहता है। लेकिन जब सूचकांक स्तंभ 8 बाइट्स (जो कि मामला है timestamp) से बड़ा कभी नहीं होता है, वैसे भी यह अभी भी न्यूनतम आकार में है। सम्बंधित:


क्या यह idउदाहरण के लिए एक धारावाहिक क्षेत्र हो सकता है ?
किरिल जैतसेव

1
@teferi: ए serialकिसी भी रूप में अच्छा है। मुद्दा यह है कि क्या वास्तव में इसका उपयोग करने के लिए प्रश्न हैं।
इरविन ब्रान्डेसटेटर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.