• Базы данных
  • Oracle
  • Сжатие данных в целях экономии места и ускорения работы Oracle

Сжатие данных в целях экономии места и ускорения работы Oracle - Сжатие материализованного представления

ОГЛАВЛЕНИЕ

Сжатие материализованного представления

Материализованные представления можно сжимать точно так же, как и таблицы. Следующий оператор создает сжатое материализованное представление:
CREATE MATERIALIZED VIEW MV_SALES_COMP COMPRESS AS SELECT P.PART_NAME, H.STORE_ID, H.SALE_DATE, H.QUANTITY FROM SALES_HISTORY H, PARTS P WHERE P.PART_ID = H.PART_ID;

Материализованные представления на основе соединений нескольких таблиц обычно хорошо поддаются сжатию, поскольку в них часто встречаются повторяющиеся компоненты данных. Атрибут сжатия для материализованного представления можно изменить с помощью оператора ALTER MATERIALIZED VIEW. Следующий оператор показывает, как сжать существующее не сжатое материализованное представление:

ALTER MATERIALIZED VIEW MV_SALES COMPRESS;

При использовании этого оператора учтите, что сжатие фактически произойдет при следующем обновлении материализованного представления.

Сжатие секционированной таблицы1

Вариантов использовании сжатия для секционированных таблиц много. Сжатие можно применять либо на уровне таблицы, либо на уровне секции. Например, оператор CREATE TABLE в Листинге 1 создает таблицу из четырех секций. Поскольку COMPRESS задается на уровне таблицы, все четыре секции будут сжиматься.

Поскольку сжатие может быть задано на уровне секции, можно некоторые секции сжать, а другие оставить не сжатыми. Пример в Листинге 2 демонстрирует, как задать сжатие на уровне секции.

В Листинге 2 две секции таблицы (SALES_Q1_03 и SALES_Q2_03) сжаты, а остальные две остаются не сжатыми. Учтите, что атрибуты сжатия, заданные на уровне секции, переопределяют атрибуты, заданные для этой же секции на уровне таблицы. Если атрибут сжатия для секции не задан, эта секция наследует значение из определения на уровне таблицы. В Листинге 2, поскольку атрибуты сжатия для секций SALES_Q3_03 и SALES_Q4_03 не указаны, эти две секции наследуют значение из определения таблицы (которое, в данном случае, стандартно - NOCOMPRESS).

Секционированные таблицы обеспечивают совместно со сжатием одно уникальное преимущество. Один из полезных способов секционировать таблицы - поместить подлежащие изменению (вставке, обновлению и удалению) данные в отдельные секции, а данные только для чтения вынести в другие. Например, в определении таблицы в Листинге 2 данные о продажах секционированы по значению столбца SALE_DATE, так что хронологическая информация о продажах в каждом квартале хранится в отдельной секции. В этом примере данные о продажах за первый (Q1) и второй (Q2) кварталы 2003 года не могут быть изменены, поэтому они помещены в сжатые секции SALES_Q1_03 и SALES_Q2_03. Данные о продажах за третий (Q3) и четвертый (Q4) кварталы все еще могут меняться, поэтому соответствующие секции, SALES_Q3_03 и SALES_Q4_03, оставлены не сжатыми.

Если в конце третьего квартала 2003 года данные в секции SALES_Q3_03 становятся доступными только для чтения, можно сжать эту секцию с помощью оператора ALTER TABLE ... MOVE PARTITION, как показано ниже:

ALTER TABLE SALES_PART_COMP
MOVE PARTITION SALES_Q3_03 COMPRESS;

Чтобы узнать, какие секции таблицы сжаты, можно выполнить запрос к представлению USER_TAB_PARTITIONS словаря данных, как в следующем примере:

SELECT TABLE_NAME, PARTITION_NAME,
COMPRESSION
FROM USER_TAB_PARTITIONS;

TABLE_NAME PARTITION_NAME COMPRESSION
---------------------------- -----------
SALES_PART_COMP SALES_Q4_03 DISABLED
SALES_PART_COMP SALES_Q1_03 ENABLED
SALES_PART_COMP SALES_Q2_03 ENABLED
SALES_PART_COMP SALES_Q3_03 ENABLED

Оценка преимуществ

Основной причиной использования сжатия таблицы является экономия дискового пространства. Таблица в сжатом виде обычно занимает меньше места. Чтобы проиллюстрировать это утверждение, рассмотрим следующий с двумя таблицами: одна не сжатая (SALES_HISTORY), а другая - сжатая (SALES_HISTORY_COMP). В обе эти таблицы данные были загружены с помощью непосредственной загрузки утилитой SQL*Loader из текстового файла, содержащего два миллиона строк. После выполнения обеих загрузок оказалось, что сжатая таблица занимает на диске почти вдвое меньше места, чем не сжатая. Анализ представлен в Листинге 3.

Тот факт, что для хранения сжатой таблицы надо меньше блоков, приводит к экономии дискового пространства, но уменьшение количества блоков может приводить и к повышению производительности. Запросы к сжатой таблице в среде с ограниченной производительностью ввода-вывода часто будут выполняться быстрее, поскольку требуют прочтения меньшего количества блоков. Чтобы проиллюстрировать это утверждение, я выполнил запрос к сжатой и не сжатой таблице и проанализировал результаты SQLTRACE/TKPROF. Эти результаты представлены в Листинге 4.

Отчет SQLTRACE/TKPROF показывает, что мой запрос к сжатой таблице потребовал меньше операций физического и логического ввода-вывода, чем аналогичный запрос к не сжатой таблице, и, как следствие, выполняется быстрее.
Снижение производительности при загрузке

Поскольку сжатие таблицы выполняется при массовой загрузке, операции загрузки требуют дополнительной обработки - надо выполнять дополнительные действия. Чтобы измерить влияние сжатия на производительность, я выполнил тест, в котором загружал один миллион строк (с помощью непосредственной загрузки утилитой SQL*Loader) в две идентичных таблицы: со сжатием и без сжатия. В Таблице 1 представлены результаты, взятые из журнальных файлов SQL*Loader и показывающие, сколько времени потребовалось для загрузки данных в каждую из таблиц.
Имя таблицы Количест- во строк Способ загрузки Сжатая? Время загрузки
SALES_HISTORY 1000000 Непосред- ственная Не сжатая 00:00:21.12
SALES_HISTORY_COMP 1000000 Непосред- ственная Сжатая 00:00:47.77

Таблица 1: Сравнение времени загрузки данных для сжатой и не сжатой таблиц

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

Заключение

Сжатие таблицы в Oracle9i Release 2 позволяет существенно сэкономить дисковое пространство, особенно в базах данных, содержащих большие таблицы только для чтения. Если учитывать дополнительные требования к загрузке и вставке данных, а также правильно выбрать таблицы-кандидаты для сжатия, сжатие таблиц может оказаться потрясающим способом экономии дискового пространства и, в некоторых случаях, повышения производительности запросов.