ными ключами, поскольку их понадобилось бы слишком много. Выбрав вариант с bitmap-индексом по каждому атрибуту (столбцу), мы заставим оптимизатор запросов динамически определить, какие индексы необходимо просмотреть в параллельном режиме и объединить посредством поразрядных логических операций.
Совет:
Bitmap-индексы не обязательно должны быть одностолбцовыми. При необходимости вы можете задать битовую карту для комбинации значений нескольких столбцов (от 1 до 16), но мы сомневаемся, что есть какие-либо веские причины для того, чтобы это использовать.
В Oracle? поддержка bitmap-индексов возможна лишь при условии приобретения Parallel Query Option (PQO). В настоящий момент мы не знаем, действует ли это правило в OracleS.
Другой реальный недостаток индексов, имеющих структуру В*-дерева,— их размер (минимальная потребность в пространстве на индексированную строку составляет 13 байтов). Строки со значением ключа, равным NULL, в индекс не входят, поэтому нельзя сказать, что минимум всегда равен 13 байтам на строку. Для типичного столбца VARCHAR2(2) в таблице большого размера количество килобайтов, необходимое для обычного индекса по этому столбцу, можно приблизительно определить путем простого умножения ожидаемого числа строк на 14 и деления результата на 1000 (или 1024). Теоретически, минимальная потребность в пространстве в bitmap-индексе составляет 1 бит на строку для каждого значения ключа, но bitmap-индексы хранятся в сжатом виде, поэтому занимают меньше места, чем получается при грубом подсчете. Получить из битовой карты ROWID (номер блока в таблице и номер строки в блоке) — задача не из тривиальных, поэтому используемый для этого механизм требует дополнительных затрат. Тем не менее, в проведенных нами тестах bitmap-индексы с ограниченным количеством значений ключа оказывались гораздо меньшими по объему, чем эквивалентные им индексы на основе В*-дерева (в некоторых случаях они составляли всего 10% объема обычных индексов). Даже при построении bitmap-индекса по уникальному ключу (что, в общем-то, глупо) мы обнаружили, что полученный в результате индекс всего на 50% больше обычного (при этом, правда, выборка строк выполнялась несколько медленнее).
Предупреждение:
К своему огорчению, в процессе тестирования мы выявили, что для одного столбца или их совокупности нельзя одновременно иметь и bitmap-индекс, и индекс со структурой В*-дерева. Попытка создать второй индекс приводит к сообщению об ошибке:
ORA-1408: such column list already indexed.
Это весьма печально, поскольку бывают ситуации, в которых полезно иметь и bitmap-индекс (для выполнения комбинированных проверок на
82	OracleS