Я попытаюсь объяснить мои недоразумения на следующем примере.
Я не понимал основы из 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
. Или это на самом деле не имеет значения, и все, что мы должны знать, это просто найти блок по его растровому изображению довольно быстро ...?