इरविन, चूंकि यह हमारी टिप्पणी से पहले चर्चा में था, मैंने इसे थोड़ा और आगे बढ़ाने का फैसला किया ...
मेरे पास यथोचित आकार की तालिका से एक बहुत ही सरल क्वेरी है। मेरे पास आमतौर पर पर्याप्त है work_mem, लेकिन इस मामले में मैंने आदेशों का उपयोग किया है
SET work_mem = 64;
बहुत छोटा work_memऔर सेट करने के लिए
SET work_mem = default;
work_memमेरी क्वेरी के लिए पर्याप्त रूप से बड़े होने के लिए मेरी पीठ सेट करने के लिए।
एक्सप्लेन और रीचेक कंडीशन
इसलिए, केवल के EXPLAINरूप में मेरी क्वेरी चल रही है
EXPLAIN
SELECT * FROM olap.reading_facts
WHERE meter < 20;
मैंने निम्न और उच्च दोनों के लिए परिणाम प्राप्त किए work_mem:
कम work_mem
Bitmap Heap Scan on reading_facts (cost=898.92..85632.60 rows=47804 width=32)
Recheck Cond: (meter < 20)
-> Bitmap Index Scan on idx_meter_reading_facts (cost=0.00..886.96 rows=47804 width=0)
Index Cond: (meter < 20)
उच्च work_mem
Bitmap Heap Scan on reading_facts (cost=898.92..85632.60 rows=47804 width=32)
Recheck Cond: (meter < 20)
-> Bitmap Index Scan on idx_meter_reading_facts (cost=0.00..886.96 rows=47804 width=0)
Index Cond: (meter < 20)
लंबी कहानी छोटी है, EXPLAINकेवल के लिए, जैसा कि उम्मीद थी कि क्वेरी योजना इंगित करती है कि एक रीचेक स्थिति संभव है, लेकिन हम यह नहीं जान सकते कि क्या वास्तव में गणना की जाएगी।
विश्लेषण और स्थिति को फिर से जाँचें
जब हम ANALYZEक्वेरी में शामिल होते हैं , तो परिणाम हमें उस बारे में अधिक बताते हैं जो हमें जानना आवश्यक है।
कम work_mem
Bitmap Heap Scan on reading_facts (cost=898.92..85632.60 rows=47804 width=32) (actual time=3.130..13.946 rows=51840 loops=1)
Recheck Cond: (meter < 20)
Rows Removed by Index Recheck: 86727
Heap Blocks: exact=598 lossy=836
-> Bitmap Index Scan on idx_meter_reading_facts (cost=0.00..886.96 rows=47804 width=0) (actual time=3.066..3.066 rows=51840 loops=1)
Index Cond: (meter < 20)
उच्च work_mem
Bitmap Heap Scan on reading_facts (cost=898.92..85632.60 rows=47804 width=32) (actual time=2.647..7.247 rows=51840 loops=1)
Recheck Cond: (meter < 20)
Heap Blocks: exact=1434
-> Bitmap Index Scan on idx_meter_reading_facts (cost=0.00..886.96 rows=47804 width=0) (actual time=2.496..2.496 rows=51840 loops=1)
Index Cond: (meter < 20)
फिर से, जैसा कि अपेक्षित था, ANALYZEहमें कुछ बहुत महत्वपूर्ण जानकारी का पता चलता है। निम्न work_memस्थिति में, हम देखते हैं कि अनुक्रमणिका जाँच द्वारा निकाली गई पंक्तियाँ हैं, और हमारे पास lossyढेर ब्लॉक हैं।
निष्कर्ष? (या उसके अभाव)
दुर्भाग्य से, ऐसा लगता है कि यह EXPLAINअपने आप में यह जानना पर्याप्त नहीं है कि क्या वास्तव में एक इंडेक्स रीचेक आवश्यक होगा क्योंकि बिट आईडी के ढेर स्कैन के दौरान कुछ पंक्ति आईडी को पृष्ठों को बनाए रखने के पक्ष में गिराया जा रहा है।
उपयोग करना EXPLAIN ANALYZEमध्यम लंबाई के प्रश्नों के साथ मुद्दों के निदान के लिए ठीक है, लेकिन इस मामले में कि एक क्वेरी को पूरा करने के लिए एक बहुत लंबा समय लग रहा है, फिर EXPLAIN ANALYZEयह पता लगाने के लिए कि आपका बिटमैप इंडेक्स अपर्याप्त होने के कारण हानिपूर्ण में परिवर्तित हो रहा work_memहै, अभी भी एक कठिन बाधा है। काश EXPLAIN, टेबल आँकड़ों से इस घटना की संभावना का अनुमान लगाने का एक तरीका होता ।