Индексы создаются, чтобы сервер Oracle мог максимально эффективно находить запрошенные строки. Индексы на основе битовых карт - не исключение, однако стратегия, лежащая в основе этих индексов, очень отличается от стратегии, на которой базируются индексы на основе B*-дерева. Чтобы продемонстрировать это, мы начнем с изучения содержимого нескольких блоков.
Рассмотрим SQL-сценарий на рис. 1.
create table t1 nologging as select rownum id, mod(rownum,10) btree_col, mod(rownum,10) bitmap_col, rpad('x',200) padding from all_objects where rownum
Рисунок 1. Пример данных.
Обратите внимание, что столбцы btree_col и bitmap_col заданы так, что содержат идентичные данные, - числа от 0 до 9, повторяющиеся циклически.
В базе данных версии 9.2 с размером блока 8 Кбайт результирующая таблица займет 882 блока. Индекс на основе B*-дерева будет иметь 57 листовых блоков, а индекс на основе битовых карт - 10 листовых блоков.
Фрагмент листового блока индекса на основе B*-дерева
row#538[2016] flag: -----, lock: 0 col 0; len 2; (2): c1 02 col 1; len 6; (6): 00 40 c5 7d 00 09
row#538[2004] flag: -----, lock: 0 col 0; len 2; (2): c1 02 col 1; len 6; (6): 00 40 c5 7d 00 13
Фрагмент листового блока индекса на основе битовых карт
row#2[4495] flag: -----, lock: 0 col 0; len 2; (2): c1 03 col 1; len 6; (6): 00 40 c5 62 00 00 col 2; len 6; (6): 00 40 c7 38 00 1f col 3; len 3521; (3521): cb 02 08 20 80 fa 54 01 04 10 fb 53 20 80 00 02 fc 53 04 10 40 00 01 fa 53 02 08 20 fb 53 40 00 . . .
Рисунок 2. Блоки данных, сброшенные в символьном виде.
Понятно, что индекс на основе битовых карт несколько плотнее упакован, чем индекс на основе B*-дерева. Чтобы увидеть эту упаковку, можно сбросить блоки данных индекса в символьном виде с помощью команд типа:
alter system dump datafile x block y;
Результаты представлены на рис. 2. Учтите, однако, что информация, полученная в результате сброса блока в символьном виде, может иногда приводить к неверным выводам, поскольку часть ее - производная от данных, и порядок следования тоже изменен по отношению к реальному для ясности.