понедельник, 16 марта 2015 г.

Сжатие таблиц и индексов

Введение.

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

Соответственно чем больше повторяющихся значений - тем эффективнее будет сжатие. Сжатие производится на уровне блока БД, т.е. вся служебная информация для преобразования данных к исходному виду находится внутри блока. Таким образом, в каждый блок помещается больше "полезных" данных и в результате уменьшается количество блоков, освобождая место.





Сжатие таблиц.

- OLTP Compression

Для детального рассмотрения создадим тестовую таблицу.

Согласно вышеизложенной информации, в процессе сжатия повторяющиеся значения будут заменены на их алиасы. Таким образом, блок БД, содержащий табличные данные, будет выглядеть примерно так:
На самом деле происходит более сложная процедура. Для того, чтобы достичь максимального эффекта от сжатия меняется порядок следования столбцов и создаѐтся общий алиас на несколько столбцов. В нашем примере алиасы Т1 и Т3 встречаются в двух строках. При создании общего алиаса получаем следующий блок:
После этого в символьном дампе блока появляется следующая строка:

                                                            perm_9ir2[4]={ 1 2 3 0 }                                                            

Она необходима для восстановления исходного порядка столбцов и отражает правильный порядок следования столбцов относительно порядка в сжатом блоке.

В результате, для того, чтобы прочитать строку необходимо прочитать и все используемые алиасы, а это дополнительная нагрузка на CPU. Удаление строк - также дополнительная проблема, т.к. необходимо после удаления строки также корректировать таблицу соответствия, изменяя количество строк, использующих конкретный алиас.

При insert и update строк, новые строки добавляются в таблицу без сжатия, а любые изменения в строке происходят после еѐ приведения к исходному виду, и после этого она не сжимается, даже если есть подходящие алиасы.

При таком типе сжатия значение PCTFREE устанавливается в 10. Т.е. 10% места в блоке остаѐтся для будущих изменений. Сжатие блока запускается автоматически при достижении определѐнного порога заполняемости. Это происходит в фоновом режиме, что добавляет нагрузку на CPU.



- Методы реализации

  1. ALTER TABLE … COMPRESS FOR OLTP

·         Включение сжатия для новых данных, которые будут добавляться в таблицу.

  1. Online Redefinition (DBMS_REDEFINITION)

·         Включение сжатия для новых данных, которые будут добавляться в таблицу, а также сжатие существующих. Использование пакета DBMS_REDEFINITION позволяет во время сжатия производить любые DML операции над таблицей.

·         Во время online redefinition индексы автоматически перестраиваются вместе с таблицей.


  1. 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 индексов:
  1. Быстрый поиск нужных строк в таблице без FULL TABLE SCAN
  2. Чтение индекса для нахождения нужных строк без доступа к таблице
  3. Избегание операций сортировки (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 выполняются следующие действия:
  1. В row_heap добавляются строки, содержащие уникальные значения префиксов
  2. Добавляется вторая row_direcory для префиксов
  3. В 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 нельзя. Производить их перестройку можно только в рамках отдельных партиций, а при выключенной компрессии на уровне всего индекса это не поможет.


Комментариев нет:

Отправить комментарий