pgsql bitmap index

Bitmap index

  • Bitmap индексы появились в версии 8.1
  • Это служебные индексы, строятся в памяти во время планирования запроса.
  • Не путать с bitmap индексами, которые создаются на диске и используются для работы с данными с малым количеством уникальных значений, например пол (муж./жен.)
  • Пользователь может отключать их использование (enable_bitmapscan)
  • Их основное использование - это оптимизация работы с несколькими индексами.

В отличие от обычного сканирования индекса, в котором за один раз из индекса считывается только один указатель на запись, по которому потом поднимается сама запись из таблицы, bitmap scan считывает все указатели за один раз (Bitmap Index Scan), сортирует их в памяти и потом считывает записи уже в локализованном на диске порядке (Bitmap Heap Scan). Таким образом, увеличивается скорость чтения записей с диска, но ценою создания в памяти специальной структуры данных. Заметим, что производительность ORDER BY может пострадать, так как записи считываются не в том порядке, как они хранились в индексе.

Если bitmap становится очень большим, то вместо записей хранятся ссылки на страницы, которые содержат записи, удовлетворяющие запросу. Поэтому, в таком случае, необходима дополнительная проверка (Recheck), чтобы получить только требуемые записи.

Bitmap индексы очень эффективны для работы с несколькими индексами, так как сначала они комбинируются с учетом AND/OR операций (очень эффективным способом), и только потом результат импользуется для работы с таблицами. Отметим, что можно использовать многоколоночные индексы, однако проще использовать Bitmap индексы, так как они покрывают большее количество различных комбинаций.

Однако, bitmapscan может быть полезен и для работы с одним индексом, так как доступ к данным происходит последовательно, а не в произвольном порядке. При этом, cчитается, что обычный indexscan эффективнее bitmapscan-а для малого количества считываемых записей, в то время как seqscan эффективнее bitmapscan-а если приходится считывать с диска значительную долю таблицы.