[an error occurred while processing this directive]
[an error occurred while processing this directive]М.А. Смирнов
Обзор применения методов безущербного сжатия данных в СУБД
Часть 4
Содержание | Часть 1 | Часть 2 | Часть 3 | Часть 4
2. Использование сжатия данных в современных СУБД
Сжатие данных поддерживается практически во всех современных СУБД. Ниже дан обзор приемов экономного кодирования, применяемых в конкретных системах. Описания упорядочены в соответствии с алфавитным порядком наименований СУБД13.
СУБД ADABAS немецкой фирмы Software AG является системой уровня предприятия, предназначенной для использования в сложных приложениях с большим количеством активно работающих пользователей и жесткими требованиями к производительности и надежности.
Система ADABAS поддерживает сжатие таблиц базы данных [52]. В версии 6.2 реализованы два способа сжатия, работающих на уровне значений атрибутов:
В [52] указывается, что встроенные методы сжатия позволяют сократить размер базы примерно в 2 раза относительно формы представления с полями фиксированной длины.
В версии 7.1.2 СУБД последовательности отсутствующих значений в конце строк полностью отсекаются и физически не сохраняются [31]. В этой версии используется и сжатие индексов, при котором устраняется повторение начальной части индексных значений, располагаемых друг за другом в индексной структуре.
Системы управления данными фирмы IBM традиционно содержат механизмы экономного кодирования информации. СУБД DB2 поддерживает сжатие данных как на программном уровне, так и на аппаратном [10, 32].
В версиях DB2 ниже 3-ей таблицы могли быть сжаты с помощью специальных процедур, ассоциируемых с таблицей при ее создании. В частности, предоставлялся исходный код типовой реализации алгоритма Хаффмана. Пользователи могли модифицировать алгоритм или создавать свои процедуры, реализующие иные алгоритмы. Ряд независимых производителей предлагал набор такого рода модулей.
Начиная с версии 3 DB2 поддерживает словарный метод сжатия, реализованный в аппаратной платформе S/390. В последнем случае кодирование-декодирование выполняется специальным процессорным модулем мейнфрейм-платформы S/390. Если процессорный модуль сжатия не доступен, то используется программная реализация. Алгоритм сжатия основан на одном из вариантов LZW, известном как метод Миллера-Уэгнама (Miller-Wegnam), или LZMW [32, 1]. В отличие от LZW, в методе Миллера-Уэгнама каждая фраза словаря представляет собой конкатенацию двух других фраз, а не фразы и символа алфавита данных. В DB2 сжатие выполняется на уровне строки и является полуадаптивным. Словарь строится при загрузке данных. В случае необходимости можно собрать статистику и реорганизовать словарь.
Сжатию может подвергаться как таблица, так и ее отдельные разделы. Соответственно, каждая сжатая таблица или раздел таблицы имеют свой словарь, размещаемый в заголовке объекта как метаинформация. Не все записи могут подвергаться кодированию. Если определяется, что для некоторой записи процедура сжатия не дает положительного эффекта, то запись помечается соответствующим флагом и сохраняется в исходном виде. Также записи могут не кодироваться, если это приводит к получению более 255 строк на страницу, что обусловлено ограничениями внутреннего устройства СУБД.
Словарь может включать в себя 512, 1024, 2048 и 4096 фраз. Объем словаря в байтах равен размеру во фразах, умноженному на 16.
В [32] отмечается, что выбор способа сжатия был обусловлен следующими аргументами:
Построение словаря и сжатие может выполняться двумя способами с помощью двух различных утилит, LOAD и REORG. Утилита LOAD обеспечивает загрузку данных в таблицу. При этом записи, использованные для построения словаря, не сжимаются. Сжатие строк выполняется только после заполнения словаря. Это может заметно ухудшать сжатие для небольших таблиц. REORG обеспечивает экономное кодирование всех строк. В REORG выполняется построение словаря на основании выборки строк из всего массива данных сжимаемого объекта. При формировании выборки предпочтение отдается первым по порядку записям: чем дальше расположены записи от начала таблицы (раздела), тем с большим шагом они выбираются. Для улучшения сжатия сначала строится словарь размером вплоть до 214 = 16384 фраз, что позволяет накопить более полную статистику, а затем уменьшается до допустимого объема удалением редко используемых элементов.
Утилита REORG используется и для перестройки словаря в случае необходимости. Например, после существенного изменения содержимого таблицы.
В буферном пуле страницы сохраняются сжатыми. Декодируются только выбираемые по запросу записи. При вставке и обновлении записей они сжимаются и записываются в буферный пул. Это позволяет уменьшить расход памяти под буферный пул и/или увеличить процент успешных попаданий в него.
Записи журнала (регистрационного файла СУБД), соответствующие сжатым строкам, также содержат данные в закодированном виде.
Следует отметить, что в DB2 версий 3-5 нет возможности сжимать индексы.
В [10] и [32] приводятся следующие результаты сравнения характеристик системы в зависимости от использования сжатия:
Система Ingres фирмы Computer Associates представляет собой промышленную СУБД, ориентированную на приложения уровня предприятия.
Следует отметить, что существуют две разновидности Ingres: свободно распространяемая “академическая” Ingres и коммерческая, разрабатываемая и продаваемая Computer Associates. “Академическая” Ingres (INteractive Graphics REtrieval System — интерактивная система доставки графических данных) является исходной версией системы, разработанной в Университете Беркли в 1970-х годах для демонстрации возможностей РСУБД. Поэтому есть серьезные основания считать Ingres первой реализацией РСУБД, ведь она была создана раньше канонического комплекса System R фирмы IBM. Коммерческая Ingres создавалась на основе “академической”, но в настоящее время это программы с принципиально разными характеристиками. Вся последующая информация касается исключительно коммерческой Ingres фирмы Computer Associates.
Текущие версии Ingres выпускаются под маркой Advantage Ingres. Предыдущими марками являлись наименования OpenIngres и Ingress II.
Источники, использованные при подготовке данного обзора, противоречивы относительно методов сжатия, применяемых в Ingres.
Из руководства администратору для версии 2.6 системы следует, что структуры, в которых размещаются данные, могут сжиматься за счет использования строк переменной длины при хранении текстовых полей и экономного кодирования отсутствующих значений (NULL) атрибутов любого типа [19]. При этом представляются в сжатом виде как собственно данные, так и индексная информация. В зависимости от типа структуры данных, может не поддерживаться сжатие первичных ключей и индексов. Таким образом, способы сжатия являются тривиальными.
В неформальном тексте “Ответы на часто задаваемые вопросы по Ingres” [30] указывается, что в версиях СУБД OpenIngres 1.x использовался метод сжатия LZW. Автор текста [30] не имеет непосредственного отношения к фирме Computer Associates, поэтому данную информацию нельзя считать заслуживающей доверия. Возможно, что метод LZW действительно применялся в ранних версиях, но не используется в современной Advantage Ingres.
Системообразующим компонентом “настольной” СУБД Microsoft Access является программа Microsoft Jet, обеспечивающая чтение и сохранение информации в базах данных. Начиная с версии 3 Microsoft Jet обеспечивается сжатие ключей в индексах [18]. Исходя из имеющейся информации тип метода сжатия не представляется возможным определить. В источнике лишь указывается, что в результате экономного кодирования устраняется дублирование значений ключей.
MySQL относится к группе простых систем управления данными. Но в последние годы система получила большую популярность. Значительную роль в этом сыграли статус программы с открытым исходным кодом и простые интерфейсы взаимодействия с программами на языках программирования PHP, C, C++, Java и ряду других, что позволило без больших затрат встраивать MySQL в прикладные системы. Отсутствие в MySQL большого количества системных и вспомогательных функций, характерных для промышленных РСУБД, компенсируется высокой скоростью выполнения запросов на чтение. MySQL распространяется разработчиком, фирмой MySQL AB, под двумя лицензиями: "общедоступной" лицензии для открытого ПО General Public License (GPL) или альтернативной коммерческой лицензией. Базовая лицензия GPL диктует, в частности, необходимость распространения с исходным кодом как MySQL, так и непосредственно использующих ее программ.
В версии 4.0.18 использование сжатия данных представлено в следующих аспектах [41].
Методы могут применяться совместно, в том числе допускается каскадное использование. Таблицы кодов Хаффмана могут использоваться для декодирования сразу нескольких колонок. При сжатии таблицы генерируется статистика, которая используется оптимизатором запросов. Сжатая таблица может быть преобразована в обычную.
Кроме того, в версии 4.1.1 поддерживается кодирование-декодирование значения столбца с помощью функций Compress/Uncompress:
SELECT Uncompress(Compress("any string")); à "any string"
Использование этих функций требует, чтобы система MySQL была скомпилирована с библиотекой сжатия zlib (реализует LZH) или подобными.
РСУБД Oracle одноименной фирмы является наиболее распространенной промышленной системой управления данными. В настоящее время последней версией комплекса является Oracle9i Release 2.
В СУБД Oracle реализовано как сжатие таблиц, так и сжатие индексов. Но если экономное представление индексов использовалось еще в Oracle версий 7 и 8 [13], то полноценное сжатие таблиц поддерживается только в самой последней версии [45].
В Oracle версий 7 и 8 существовал особый вид структуры хранения данных под названием “индексная таблица” (index-organized table). Данные такой таблицы сохранялись совместно с индексной информацией (атрибуты первичного ключа такой таблицы описывались только в индексной структуре) [44]. При этом поддерживалось частичное сжатие значений составного первичного ключа в индексе. Значение составного ключа разделялось на две части: группирующая (префикс), общая для нескольких значений, и уникальная (суффикс). Префикс подвергался экономному кодированию. Возможно, при этом используется словарный алгоритм с сохранением упорядоченности, описанный одним из сотрудников корпорации Oracle в [6].
Табличное сжатие в Oracle9i Release 2 в первую очередь предназначено к использованию в системах поддержки принятия решений и OLAP-приложениях14. Сжатию могут быть подвергнуты целые таблицы, разделы таблиц и материализованные представления. Сжатие уменьшает используемый объем дискового пространства, снижает требования к размеру буфера данных и во многих случаях ускоряет обработку запросов, особенно для систем с медленным вводом-выводом информации.
Для сжатия таблиц используется метод словарного типа [45]. Сжимается или целиком столбец, или набор столбцов. Словарь формируется из значений атрибутов. Решение о добавлении значения столбца в словарь принимается на основании длины столбца и числа повторов значения. Короткие, а также редко встречающиеся значения в словарь не вносятся. Сжатие производится путем замены значения столбца на указатель на соответствующую фразу словаря. Размер словаря выбирается автоматически для каждой страницы во время загрузки данных. При этом таблица фраз и другая необходимая для декодирования информация сохраняется в каждой странице.
Для повышения степени сжатия может производиться переупорядочивание столбцов внутри одной страницы. Данное преобразование полностью скрыто от внешней среды. При значительных изменениях в данных словарь адаптируется.
В [45] утверждается, что внедрение алгоритма сжатия потребовало изменения только тех модулей, которые связаны с формированием блока и доступом к строкам и столбцам. Нет никакой разницы в функциональности, обеспечиваемой сжатыми и несжатыми таблицами.
Достигаемая степень сжатия и изменение скорости выполнения запросов зависят от характера данных и вида обращений к БД. В [45] приведены результаты тестирования для двух схем: типовое хранилище данных, организованное по схеме “звезда” и имеющее 1 таблицу фактов и 5 таблиц с измерениями, и стандартная схема из тестов TPC-H/TPC-R, ориентированных на оценку СППР. Последняя схема содержит 8 таблиц и является нормализованной, хотя ее структура не относится к типу “звезда”. Отмечаются следующие результаты:
Первоначальный размер первой базы составлял 55 Гбайт, второй — 115 Гбайт. Для первого примера сжималась только таблица фактов и материализованные представления, поскольку размер таблиц с измерениями обычно мал для схем типа “звезда”. Для второго примера сжимались две самые большие таблицы. Подобно таблице фактов в первой схеме, эти таблицы содержали числовые данные. Разница в сжатии обусловлена в первую очередь большей мощностью множеств значений, принимаемых атрибутами таблиц во втором примере. Кроме того, распределения значений колонок для второй схемы более равномерны, что ухудшает сжатие.
Битовые индексы представляются в базах Oracle в экономном виде. В [13] указывается, что в Oracle версии 8 используется схема сжатия битовых индексов, описанная в патенте [5]. Этот метод сжатия, байтовое сжатие битовых карт, позволяет корректно сравнивать данные без их декодирования. Метод кратко описан выше в пункте “Сжатие битовых карт” параграфа “Сжатие индексных структур”.
В [37] утверждается, что в версии Oracle 8i Release 8.1.5 поддерживается частичное сжатие значений составного первичного ключа в индексе типа B-дерева, аналогичное экономному кодированию первичного ключа в индексных таблицах.
Программный комплекс SAS System фирмы SAS Institute не является СУБД как таковой. Это сложная система для хранения, анализа и доставки информации. Хотя некоторые специалисты причисляют SAS System к системам управления статистическими базами данных [53], данный программный комплекс не обеспечивает транзакционную работу и имеет сравнительно скромную поддержку совместного доступа к данным на запись. Тем не менее, SAS System часто применяется при организации корпоративных хранилищ данных и создании OLAP-приложений.
В SAS System реализовано 2 метода сжатия данных, и при этом есть возможность программировать иные алгоритмы сжатия с помощью специального инструментального средства разработки [51]. Первым методом является кодированием длин серий (RLE). Эта техника очень эффективна для кодирования таблиц с текстовыми колонками, поскольку по умолчанию все строки любой таблицы в SAS System имеют одинаковую фиксированную длину. Вторым методом является метод сжатия Росса (Ross Data Compression)15. В этой технике применяется словарное сжатие со скользящим окном в сочетании с кодированием длин серий. Данные сжимаются по записям, т.е. единицей сжатия является строка. Метод ориентирован на сжатие числовых полей и хорошо работает при длине строки от нескольких сотен байтов и больше.
Сжатие всегда применяется только ко всей таблице. Способ сжатия можно задавать только для создаваемой таблицы. При этом также можно указать два способа удаления и вставки новых записей в сжатую таблицу. При первом способе строки вставляются в конец таблицы вне зависимости от наличия вакантных секций (слотов) внутри таблицы. При втором способе отслеживаются пустующие секции внутри таблицы и вставляемые записи могут быть размещены в них, что приводит к экономии дискового пространства. Но в последнем случае нельзя обратиться к строке по ее номеру.
Также необходимо отметить возможность организации словарного сжатия значений атрибутов. Это обеспечивается механизмом форматов, позволяющим по-разному представлять данные. Можно задать такой формат, который поставит в соответствие числам строковые константы. Например, можно определить формат $regions., в соответствии с которым при обработке данных будут автоматически выполняться преобразования типа: 1 à “Европа”, 2 à “Азия” и т.п. Если сопоставить такой формат числовой колонке таблицы, то получится реализация словарного сжатия на уровне значений атрибута. В общем случае использование форматов требует определенного учета в прикладных программах, т.е. процесс работы с преобразованными данными не является “прозрачным”.
Sybase IQ — это высокопроизводительная СУБД, ориентированная на использование в системах поддержки принятия решений.
В [24] со ссылкой на одного из сотрудников фирмы Sybase указывается, что в Sybase IQ используется схема сжатия на основе LZ7616. При этом не поддерживается избирательное декодирование отдельных кортежей, сжимается целиком страница. В буферном пуле сохраняются как распакованные, так и сжатые версии страниц. В работе [25] того же автора утверждается, что схема сжатия в Sybase IQ сходна с алгоритмом сжатия, используемым в компрессоре Gzip. Указывается, что применяется коммерческая версия Gzip, разработанная фирмой Stacker. Поскольку Gzip использует формат сжатых данных Deflate [1] и, следовательно, реализует метод LZH, то можно сделать заключение об использовании в Sybase IQ словарной схемы типа LZ77 с последующим блочно-адаптивным кодированием по алгоритму Хаффмана.
Из руководства администратору СУБД [56], относящегося к Sybase IQ версий 11.2.x, следует, что в результате сжатия физические страницы (таблиц базы) размером 16 условных блоков преобразуются в логические. При стандартном размере блока в 4 кБайт размер физической страницы составляет 64 кБайт. Размер логической страницы может составлять 1, 2, 4, 8 и 16 блоков. Логические страницы размещаются последовательно во внешней памяти и считываются порциями, соответствующими размеру физической страницы. Таким образом, вне зависимости от характеристик данных и размера блока, максимальная степень сжатия равна 16. Размер физической страницы может быть уменьшен с используемых по умолчанию 16 блоков до 2, 4 или 8 блоков. В этих случаях максимальная степень сжатия уменьшается до 2, 4 и 8 соответственно, но требуется меньше оперативной памяти для буферов и выполнения декодирования.
Эффективность сжатия существенно определяется тем, что таблицы в Sybase IQ сохраняются по колонкам, а не построчно.
В [4] указывается использование сжатия при представлении битовых индексов в Sybase IQ. В [25] отмечается, что битовые индексы сжимаются с помощью того же словарного метода, что и данные. Из руководства администратору [56] следует, что система обеспечивает сжатие индексных структур любого вида с помощью метода сжатия одного типа.
Комплекс Teradata фирмы NCR является реляционной СУБД и позиционируется на рынке производителем как средство ведения больших хранилищ данных. Таким образом, данная СУБД ориентирована на использование в системах поддержки принятия решений.
Teradata версии 2 Release 5.0 поддерживает словарное сжатие таблиц на уровне значений колонок [40]. Каждая колонка может быть независимо закодирована с помощью словаря наиболее часто используемых значений этого атрибута. Размер словаря должен быть равен 2n-1, n = 1…8, и составляет максимум 255. Если атрибут может принимать неопределенное значение (NULL), то оно сжимается независимо. Словарь для каждой колонки сохраняется в заголовке таблицы. В заголовке каждой строки имеются флаги для указания факта сжатия значений колонок. Ссылка на фразу словаря для сжатого значения атрибута также записывается в заголовке строки.
Недостатком реализации метода является невозможность применения сжатия к атрибутам типов “строка переменной длины” (VARCHAR), “время” (TIME) и некоторых других более специфичных.
На основании ряда экспериментов над несколькими реальными базами данных в [40] указывается, что применяемый метод сжатия должен обеспечивать среднюю степень сжатия в 2 и более раз для типовых хранилищ данных, при этом ожидаемое уменьшение времени выполнения запросов составляет несколько десятков процентов.
В [40] также отмечается, что в Teradata версии 2 Release 4.0 словарь для отдельной колонки мог состоять только из одного элемента.
Фирмы-производители стараются избежать корректного сравнения их продукции с конкурирующим ПО и препятствуют появлению полной информации о поведении СУБД на стандартных тестовых наборах. Поэтому не представляется в настоящее время возможным сопоставить комплексы по степени сжатия и влиянию компрессии на скорость работы. Таблица 3 содержит сравнение систем по наличию сжатия данных и применяемым алгоритмам экономного кодирования.
[an error occurred while processing this directive]|
Система |
Сжатие таблиц |
Сжатие индексов |
Уровень сжатия таблиц |
Метод сжатия таблиц |
Заявляемая степень сжатия |
|
ADABAS, версия 7.1.2 |
X |
X |
Значение атрибута |
Поля переменной длины, кодирование отсутствующих значений |
2 |
|
DB2, версия 5 |
X |
. |
Строка |
Кодирование по статическому словарю LZMW |
2-2.3 |
|
Ingres, версия 2.6 |
X |
X |
Значение атрибута |
Поля переменной длины, кодирование отсутствующих значений |
? |
|
Microsoft Access, ядро MS Jet 3.0 |
. |
X |
. |
. |
. |
|
MySQL, версия 4.0.18 |
X |
X |
Значение атрибута |
Кодирование по Хаффману, устранение серий нулей и пробелов, упаковка битов, словарь значений атрибута |
1.7-3.3 |
|
Oracle, версия 9i Release 2 |
X |
X |
Значение атрибута |
Статический словарь значений атрибута |
1.4-3.1 |
|
SAS System, версия 8.2 |
X |
. |
Строка |
Кодирование длин серий и словарное сжатие со скользящим окном |
? |
|
Sybase IQ, версия 11.2 |
X |
X |
Страница |
Словарное сжатие со скользящим окном типа LZH |
? |
|
Teradata, версия 2 Release 5.0 |
X |
? |
Значение атрибута |
Статический словарь значений атрибута |
2 |
Примечание: “X” обозначает факт наличия сжатия, “.” — отсутствие сжатия, “?” — отсутствие достаточной информации.
Все рассмотренные промышленные системы управления данными поддерживают такой способ экономного кодирования информации, как использование полей переменной длины. Но лишь ряд СУБД реализует более сложные методы сжатия. Показательно, что в этом случае для сжатия табличных данных используются исключительно словарные методы. Предпочтение отдается сжатию на уровне значения атрибута, что упрощает работы по выборке и по кодированию-декодированию данных при выполнении запросов. С другой стороны, сжатие на уровне строк и страниц должно способствовать улучшению степени сжатия в первую очередь текстовых данных и может иметь в этом свое преимущество. Заявляемая производителями степень сжатия БД составляет 2 и более раз.
Таким образом, реализации методов сжатия в СУБД отстают от современных достижений в этой сфере научной деятельности. Поддержка сжатия часто связана с ограничениями по типу данных и уменьшением функциональности сжатых объектов. Слабо используются прогрессивные разработки в сжатии числовых и структурированных текстовых данных, в том числе позволяющие оперировать непосредственно закодированными данными при обработке запроса. Не уделяется внимание вопросу сжатия результирующих наборов, позволяющего значительно повысить производительность в распределенных информационных системах с малой пропускной способностью каналов связи. Возможно, в существующих системах недостаточно эффективно решается задача построения плана выполнения запроса с учетом факта сжатия данных, поскольку в доступных источниках этот вопрос не акцентируется.
[an error occurred while processing this directive]Заключение: перспективные направления в области использования сжатия данных в СУБД
Применение сжатия данных в СУБД является перспективной и развивающейся областью знаний. Практическая польза от использования сжатия, выражающаяся в сокращении расходов памяти и повышении производительности системы, перевешивает трудности, связанные с эффективной реализацией поддержки экономного кодирования. Это в итоге должно сломить консерватизм фирм-производителей СУБД и заставить реализовать полноценную поддержку сжатия данных в их продуктах. Скорее всего, этот процесс уже начался вследствие введения поддержки сжатия табличных данных в последней версии СУБД Oracle, являющейся основным продуктом соответствующего сектора рынка.
Вместе с тем имеется целый спектр актуальных проблем, определяющих перспективные направления исследований.
Автор благодарен Вадиму Юкину и Роману Волынцу за дискуссию и ряд дельных замечаний и предложений. Также большое спасибо д-ру Ви-Кеонгу Нг (Wee-Keong Ng) и Жимону Грабовски (Szymon Grabowski) за предоставленные статьи.

Содержание | Часть 1 | Часть 2 | Часть 3 | Часть 4
Подстрочные примечания
13 Отсутствие в обзоре данных об Microsoft SQL Server — одном из основных продуктов на рынке СУБД — объясняется не антипатиями автора, как некоторые могли подумать, а отсутствием какой-либо информации об использовании экономного кодирования данных в этой системе.