मैं निम्नलिखित उदाहरण द्वारा अपनी गलतफहमी को समझाने की कोशिश करूँगा।
मैं के मूल सिद्धांतों को समझ नहीं पाया Bitmap Heap Scan Node
। प्रश्न पर विचार करें कि यह किसकी SELECT customerid, username FROM customers WHERE customerid < 1000 AND username <'user100';
योजना है:
Bitmap Heap Scan on customers (cost=25.76..61.62 rows=10 width=13) (actual time=0.077..0.077 rows=2 loops=1)
Recheck Cond: (((username)::text < 'user100'::text) AND (customerid < 1000))
-> BitmapAnd (cost=25.76..25.76 rows=10 width=0) (actual time=0.073..0.073 rows=0 loops=1)
-> Bitmap Index Scan on ix_cust_username (cost=0.00..5.75 rows=200 width=0) (actual time=0.006..0.006 rows=2 loops=1)
Index Cond: ((username)::text < 'user100'::text)
-> Bitmap Index Scan on customers_pkey (cost=0.00..19.75 rows=1000 width=0) (actual time=0.065..0.065 rows=999 loops=1)
Index Cond: (customerid < 1000)
इस नोड के बारे में मेरी समझ :
जैसा कि वहां बताया गया है , bitmap heap scan
क्रमबद्ध क्रम में टेबल ब्लॉक पढ़ता है, इसलिए यह रैंडम-टेबल-एक्सेस ओवरहेड का उत्पादन नहीं करता है जो कि बस करने के रूप में होता है Index Scan
।
के बाद Index Scan
किया गया है, PostgreSQL पता नहीं कैसे पंक्तियों को लाने के लिए, अनावश्यक रूप से heap blocks reads
(या hits
अगर वहाँ एक गर्म कैश है) से बचने के लिए । इसलिए यह पता लगाने के लिए कि यह संरचना ( Bitmap Index Scan
) उत्पन्न करता है जिसे कहा जाता है bitmap
कि मेरे मामले में सूचकांक के दो बिटमैप उत्पन्न करके और प्रदर्शन किया जा रहा है BITWISE AND
। चूंकि बिटमैप उत्पन्न हो गया है, अब अनावश्यक रूप से बचने के लिए, क्रमिक क्रम में तालिका को बेहतर ढंग से पढ़ा जा सकता है heap I/O-operations
।
यही वह जगह है जहां बहुत सारे सवाल आते हैं।
प्रश्न: हमारे पास बस एक बिटमैप है। कैसे PostgreSQL पंक्तियों के भौतिक क्रम के बारे में कुछ भी नहीं जानता है? या बिटमैप उत्पन्न करता है ताकि इसके किसी भी तत्व को सूचक को एक पृष्ठ पर आसानी से मैप किया जा सके? यदि हां, तो यह सब कुछ समझाता है, लेकिन यह सिर्फ मेरा अनुमान है।
तो, क्या हम केवल इतना कह सकते हैं कि यह bitmap heap scan -> bitmap index scan
एक अनुक्रमिक स्कैन की तरह है लेकिन केवल तालिका के उचित भाग की तरह है?
001001010101011010101
। या यह वास्तव में कोई फर्क नहीं पड़ता है और हम सभी को पता है कि यह काफी तेजी से बिटमैप द्वारा एक ब्लॉक मिल सकता है ...?