- PVSM.RU - https://www.pvsm.ru -
И снова добрый вечер!
Запускаем второй поток нашего нового курса «Реляционные СУБД» [1], который мы чуть дотюнили по итогам первого прогона: дополнительные занятия по кластерам MySQL и Postgres, оказался востребованным docker и ещё разные «доработки напильником». Так что ждите открытые уроки (в которые вынесли часть старых тем) и интересные материалы. Сегодня мы покопаемся в техниках Oracle.
Поехали.
Bitmap-индексы Oracle сильно отличаются от стандартных индексов B-дерева. В bitmap-структурах создается двухмерный массив со столбцом для каждой строки в индексируемой таблице. Каждый столбец представляет отдельное значение в bitmap-индексе. Этот двухмерный массив показывает каждое значение индекса, умноженное на количество строк в этой таблице.
Oracle распаковывает bitmap (со скоростью извлечения строки) в буфер данных ОЗУ для быстрого сканирование на предмет совпадения значений. Эти совпадающие значения передаются Oracle в виде списка Row-ID, и значения Row-ID могут напрямую обращаться к необходимой информации.

Особое преимущество bitmap-индексирования проявляется, когда одна таблица включает несколько bitmap-индексов. Мощность каждого столбца может быть невысокой. Создание нескольких bitmap-индексов предоставляет очень сильный подход для быстрого ответа на сложные SQL-запросы.

Используя методологию bitmap-объединения, Oracle обеспечивает снижает время отклика до менее секунды при работе с несколькими столбцами с малым количеством элементов.
Также обратите внимание на важные заметки о максимальных значениях Oracle bitmap-индекса [2].
Например, представим, что есть база данных автомобилей с большим числом маломощных столбцов: car_color, car_make, car_model и car_year. Каждый столбец содержит менее 100 различных значений, и индекс b-дерева был бы совершенно бесполезен в такой базе данных 20 миллионов автомобилей.
Однако, слияние этих индексов в запрос может обеспечить высокое время отклика гораздо быстрее, чем традиционный метод чтения каждой из 20 миллионов строк в базовой таблице. Например, предположим мы хотим найти старые синие Toyota Corolla, произведенные в 1981 году:
select
license_plat_nbr
from
vehicle
where
color = "blue"
and
make = "toyota"
and
year = 2015;
Для работы с этим запросом Oracle использует специализированный метод оптимизации под названием объединение bitmap-индексов. В этом методе каждый список Row-ID (кратко — RID) формируется отдельно при помощи bitmap’ов, а для сравнения RID-списков и поиска пересекающихся значений используется специальная процедура слияния.
По мере роста числа различных значений, размер bitmap увеличивается экспоненциально. Так индекс 100 значений может работать в 1000 раз быстрее, чем bitmap-индекс 1000 различных значений столбца.
Стоит помнить, что bitmap-индексы подходят только для статических таблиц и материализованных представлений, которые обновляются ночью и пересобираются после пакетной загрузки строк. Если в вашей таблице происходит несколько DML в секунду, БУДЬТЕ ОСТОРОЖНЫ при реализации bitmap-индексов!
Bitmap-индексы Oracle — очень мощная фича Oracle, но есть и подводные камни!
Вы захотите использовать bitmap-индекс в следующих случаях:
select region, count(*) from sales group by region;
Устранение неполадок bitmap-индексов Oracle
Самые распространенных проблемы реализации bitmap-индексов включают следующие:
CREATE BITMAP INDEX
emp_bitmap_idx
ON index_demo (gender);
exec dbms_stats.gather_index_stats(OWNNAME=>'SCOTT', INDNAME=>'EMP_BITMAP_IDX');
select /*+ index(emp emp_bitmap_idx) */
count(*)
from
emp, dept
where
emp.deptno = dept.deptno;
Ждём вопросы и комментарии тут или заходите к нам на новый открытый урок [3].
Автор: MaxRokatansky
Источник [4]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/302094
Ссылки в тексте:
[1] «Реляционные СУБД»: https://otus.pw/1OaX6/
[2] важные заметки о максимальных значениях Oracle bitmap-индекса: http://www.dba-oracle.com/t_bitmap_index_maximum_distinct_values_cardinality.htm
[3] открытый урок: https://otus.pw/gDR8/
[4] Источник: https://habr.com/post/433090/?utm_campaign=433090
Нажмите здесь для печати.