Спробую пояснити свої непорозуміння наступним прикладом.
Я не розумів основ цього 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
. Або це насправді не має значення, і все, що ми повинні знати, це лише те, що він може знайти блок за допомогою його растрової карти досить швидко ...?