यहाँ Postgres 9.1.6 पर एक धीमी गति क्वेरी है, भले ही अधिकतम संख्या 2 है, दोनों पंक्तियों को पहले से ही उनके प्राथमिक कुंजी द्वारा की पहचान के साथ: (4.5 सेकंड)मैं पोस्टग्रेज़ को सबक्वायरी को रेखांकित करने से कैसे रोक सकता हूं?
EXPLAIN ANALYZE SELECT COUNT(*) FROM tbl WHERE id IN ('6d48fc431d21', 'd9e659e756ad') AND data ? 'building_floorspace' AND data ?| ARRAY['elec_mean_monthly_use', 'gas_mean_monthly_use'];
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------
Aggregate (cost=4.09..4.09 rows=1 width=0) (actual time=4457.886..4457.887 rows=1 loops=1)
-> Index Scan using idx_tbl_on_data_gist on tbl (cost=0.00..4.09 rows=1 width=0) (actual time=4457.880..4457.880 rows=0 loops=1)
Index Cond: ((data ? 'building_floorspace'::text) AND (data ?| '{elec_mean_monthly_use,gas_mean_monthly_use}'::text[]))
Filter: ((id)::text = ANY ('{6d48fc431d21,d9e659e756ad}'::text[]))
Total runtime: 4457.948 ms
(5 rows)
हम्म, शायद अगर मैं के साथ एक सबक्वेरी करना सिर्फ प्राथमिक कुंजी हिस्सा पहले ...: (नहीं, अभी भी 4.5+ सेकंड)
EXPLAIN ANALYZE SELECT COUNT(*) FROM ( SELECT * FROM tbl WHERE id IN ('6d48fc431d21', 'd9e659e756ad') ) AS t WHERE data ? 'building_floorspace' AND data ?| ARRAY['elec_mean_monthly_use', 'gas_mean_monthly_use'];
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------
Aggregate (cost=4.09..4.09 rows=1 width=0) (actual time=4854.170..4854.171 rows=1 loops=1)
-> Index Scan using idx_tbl_on_data_gist on tbl (cost=0.00..4.09 rows=1 width=0) (actual time=4854.165..4854.165 rows=0 loops=1)
Index Cond: ((data ? 'building_floorspace'::text) AND (data ?| '{elec_mean_monthly_use,gas_mean_monthly_use}'::text[]))
Filter: ((id)::text = ANY ('{6d48fc431d21,d9e659e756ad}'::text[]))
Total runtime: 4854.220 ms
(5 rows)
मैं कैसे सबक्वेरी इनलाइन करने से Postgres रोका जा सकता है?
पृष्ठभूमि: मेरे पास hstore और GiST index का उपयोग करके एक पोस्टग्रेज़ 9.1 तालिका है।
जिस्ट इंडेक्स स्कैन करने पर लागत अनुमान काफी गलत लगता है (4.0 9 पर, यह प्राथमिक कुंजी की अनुक्रमणिका तक पहुंचने से कम है)। आप जांच सकते हैं कि क्या आप इसके बारे में कुछ कर सकते हैं, जैसे ताजा आंकड़े सुनिश्चित करना और/या [आंकड़े लक्ष्य] में वृद्धि करना (http://www.postgresql.org/docs/9.1/static/runtime-config-query.html#GUC -DEFAULT-सांख्यिकी-लक्ष्य)। –
मैंने लक्ष्य 99 99 तक बढ़ाया और 'वैक्यूम विश्लेषण' चलाया ... अभी भी वही लागत अनुमान बनाम वास्तविकता विसंगति प्राप्त कर रहा है। हालांकि, आपके सुझाव के लिए धन्यवाद! –