22 мая 2013 г.

Сжатие в Oracle Database

Статья десятилетней давности, но при этом не потерявшая своей актуальности, рассказывает о Basic Compression в СУБД Oracle (требует Oracle Database Enterprise Edition 9.2. и старше). Изложенный материал, с некоторыми оговорками, справедлив и для OLTP Compression в СУБД Oracle (требует опцию Oracle Advanced Compression и Oracle Database Enterprise Edition 11.1 и старше).

Сжатие в базе данных идёт на уровне блоков, а не всей таблицы. Каждый сжатый блок, содержит локальный словарь ("symbol table").  Повторяющиеся данные сохраняются в словаре, а все их вхождения заменяются на короткую ссылку.
Рассмотрим на примере из статьи как реализовано сжатие в Oracle Database:

Исходная таблица данных 
Несжатый блок vs Сжатый блок
Итак,
  • Значение "Henry" встречается в таблице дважды. Соответственно, каждое вхождение "Henry" заменяется на ссылку на локальный словарь. 
  • Значение "Todd" тоже встречается дважды: один раз как имя, другой раз как фамилия. В этом случае, алгоритм сжатия поставит ссылки, и с имени, и с фамилии на одно и то же значение в локальном словаре (технология cross-column compression). 
  • Для четвертой и пятой строки алгоритм сжатия использует технологию multi-column compression: вместо того, чтобы сохранять значения "Tom", "Smith" и "1,99" как отдельные значения, он объединяет их в локальном словаре в одно "Tom|Smith|1,99", уменьшая,таким образом, количество ссылок. 
  • Столбцы, априорно содержащие уникальные значения, например, invoice_id, - не сжимаются. 
  • Частичное сжатие значений - не поддерживается. Таким образом, хотя обе части имени "Henry-Todd" из шестой строки уже содержатся в локальном словаре, выигрыша в сжатии не происходит.
Такая реализация ускоряет выполнение некоторых запросов и операций на сжатых данных. Например, для условия where можно использовать локальный словарь, а не просматривать все строки блока. Операции UPDATE также происходят быстрее, так как можно обновить только локальный словарь, оставив ссылки без изменений.
SQL> UPDATE TABLE item SET i_color = ‘red’ WHERE i_color =’blue’;
Соответственно, рекомендации для получения высоких коэффициентов сжатия:
  • предварительная сортировка данных (чтобы в пределах одного блока оказались повторяющиеся значения)
  • сжатие данных, которые уже не будут меняться со временем
  • увеличение размера блока (параметр DB_BLOCK_SIZE)
  • сжатие столбцов, содержащих повторяющиеся длинные строковые значения

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

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