Введение.
Для детального рассмотрения создадим тестовую таблицу.
Под табличным и индексным сжатием в БД Oracle
подразумевается поиск повторяющихся данных в блоках БД, создание некой таблицы
соответствия, в которой хранятся исходные значения и их алиасы(короткие
названия) и замена повторяющихся данных на эти самые алиасы.
Соответственно чем больше повторяющихся значений - тем эффективнее будет сжатие. Сжатие производится на уровне блока БД, т.е. вся служебная информация для преобразования данных к исходному виду находится внутри блока. Таким образом, в каждый блок помещается больше "полезных" данных и в результате уменьшается количество блоков, освобождая место.
Соответственно чем больше повторяющихся значений - тем эффективнее будет сжатие. Сжатие производится на уровне блока БД, т.е. вся служебная информация для преобразования данных к исходному виду находится внутри блока. Таким образом, в каждый блок помещается больше "полезных" данных и в результате уменьшается количество блоков, освобождая место.
Сжатие таблиц.
- OLTP Compression
Для детального рассмотрения создадим тестовую таблицу.
Согласно вышеизложенной информации, в процессе сжатия
повторяющиеся значения будут заменены на их алиасы. Таким образом, блок БД,
содержащий табличные данные, будет выглядеть примерно так:
На самом деле происходит более сложная процедура. Для того,
чтобы достичь максимального эффекта от сжатия меняется порядок следования
столбцов и создаѐтся общий алиас на несколько столбцов. В нашем примере алиасы
Т1 и Т3 встречаются в двух строках. При создании общего алиаса получаем
следующий блок:
perm_9ir2[4]={
1 2 3 0 }
Она необходима для восстановления
исходного порядка столбцов и отражает правильный порядок следования столбцов
относительно порядка в сжатом блоке.
В результате, для того, чтобы
прочитать строку необходимо прочитать и все используемые алиасы, а это дополнительная
нагрузка на CPU. Удаление строк - также дополнительная проблема, т.к.
необходимо после удаления строки также корректировать таблицу соответствия,
изменяя количество строк, использующих конкретный алиас.
При insert и update строк, новые
строки добавляются в таблицу без сжатия, а любые изменения в строке происходят
после еѐ приведения к исходному виду, и после этого она не сжимается, даже если
есть подходящие алиасы.
При таком типе сжатия значение
PCTFREE устанавливается в 10. Т.е. 10% места в блоке остаѐтся для будущих
изменений. Сжатие блока запускается автоматически при достижении определѐнного
порога заполняемости. Это происходит в фоновом режиме, что добавляет нагрузку
на CPU.
- Методы реализации
- ALTER TABLE … COMPRESS FOR OLTP
·
Включение сжатия для новых данных, которые будут добавляться в таблицу.
- Online Redefinition (DBMS_REDEFINITION)
·
Включение сжатия для новых данных, которые будут добавляться в таблицу, а также сжатие существующих. Использование пакета
DBMS_REDEFINITION позволяет во время сжатия производить любые DML операции над
таблицей.
·
Во время online redefinition индексы
автоматически перестраиваются вместе с таблицей.
- ALTER TABLE … MOVE COMPRESS FOR OLTP
·
Включение сжатия для новых данных, которые будут
добавляться в таблицу, а также сжатие существующих. Во время выполнения команды
на таблицу ставится exclusive(X) lock и любые DML-операции запрещены до
завершения выполнения команды. Таблицы фактически становится read-only.
·
Происходит инвалидация всех индексов (UNUSABLE).
После этого они нуждаются в перестройке. Есть возможность указать ключ UNDATE
INDEXES и все индексы автоматически пересоздадутся, но во время ребилда на них
будет exclusive lock.
Существует два основных типа
индексов: B-TREE и BITMAP. Компрессия применима только к B-TREE индексам.
- Структура B-TREE индексов
Представляет собой древовидную
структуру, состоящую из блоков БД. Leaf Blocks – блоки, содержащие
индексируемые строки и их rowid в индексируемой таблице. Branch Blocks - блоки,
содержащие указатели на leaf blocks.
Есть 3 основных сценария использования B-TREE индексов:
- Быстрый поиск нужных строк в таблице без FULL TABLE SCAN
- Чтение индекса для нахождения нужных строк без доступа к таблице
- Избегание операций сортировки (GROUP BY,ORDER BY,DISTINCT)
Основные моменты связанные со структурой индексного блока:
·
Блок индекса состоит из row heap (набор строк сданными) и row directory (набор указателей на строки)
·
Каждая строка сожержит rowid соответствующихтабличных строк
·
Строки внутри row heap не отсортированы, сортировка производится добавлением указателей в row directory в отсортированном виде
- Сжатие B-TREE индексов
В отличие от сжатия таблиц,
индексное сжатие - операция более трудоѐмкая, т.к. требует предварительного
анализа. Индексное сжатие применимо только к нескольким начальным столбцам в
каждой строке индекса, набор сжимаемых столбцов называется префиксом, а
оставшаяся часть - суффиксом. В случае неуникальных индексов, максимальная
длина префикса равна количеству столбцов, а в случае уникальных - (количество
столбцов-1). Сжатие происходит в реальном времени.
Для примера рассмотрим таблицу:
Создадим
несжатый индекс по двум полям. Блок будет выглядеть примерно следующим образом:
В row_directory
будет 12 указателей на строки в row_heap, содержащие 2 столбца из таблицы и
столобец rowid.
При выполнении сжатия с длиной префикса 1 выполняются следующие действия:
- В row_heap добавляются строки, содержащие уникальные значения префиксов
- Добавляется вторая row_direcory для префиксов
- В row_heap редактируются суффиксы
После сжатия получаем следующий
блок:
- Методы
реализации
1.
ALTER INDEX … REBUILD [ONLINE]
COMPRESS <Prefix_Length>.
·
Включение сжатия для индекса с длиной префикса
<Prefix_Length>. В случае использования опции ONLINE перестройка
индекса не влияет на его доступность, в противном случае индекс на время
перестройки недоступен, но скорость возрастает.
·
Также можно использовать опцию “PARALLEL
<DEGREE>” для ускорения ребилда, но в таком случае после его завершения
необходимо выполнить команду:
ALTER INDEX … NOPARALLEL;
2.
Online Redefinition (DBMS_REDEFINITION)
·
Включение сжатия для индекса с заданной длиной
префикса.
·
Актуально для партицированных индексов, так как
включить сжатие для них командой ALTER INDEX … REBUILD
нельзя. Производить их перестройку можно только в рамках отдельных партиций, а
при выключенной компрессии на уровне всего индекса это не поможет.
Комментариев нет:
Отправить комментарий