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


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.