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


Загрузка данных в сжатую таблицу

Учтите, что при указании ключевого слова COMPRESS, как показано в примерах выше, вы, фактически, никаких данных не сжимаете. Представленные выше команды изменяют только установку в словаре данных. Данные реально не сжимаются, пока не будут загружены или вставлены в таблицу.

Более того, чтобы гарантировать фактическое сжатие данных, надо использовать соответствующий метод загрузки или вставки данных в таблицу. Сжатие данных происходит только при массовой загрузке или в процессе массовой вставки, с помощью одного из следующих четырех методов:
Непосредственная загрузка SQL*Loader
Последовательные вставки INSERT с подсказкой APPEND
Параллельный INSERT
CREATE TABLE ... AS SELECT

Метод непосредственной загрузки SQL*Loader - наиболее удобный способ загрузки данных в таблицу, если данные доступны в текстовом файле. Пример представлен ниже:
$sqlldr sanjay/sanjay@proddb control=sales_history.ctl direct=true

Если данные доступны в промежуточной (staging) таблице, можно использовать последовательные операторы INSERT с подсказкой APPEND или параллельный INSERT.


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

INSERT /*+ APPEND */
INTO SALES_HISTORY_COMP
SELECT * FROM SALES_HISTORY;

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

ALTER SESSION ENABLE PARALLEL DML;
INSERT /*+PARALLEL(SALES_HISTORY_COMP,4)*/
INTO SALES_HISTORY_COMP
SELECT * FROM SALES_HISTORY;

Учтите, что при использовании параллельного INSERT надо сначала включить распараллеливание операторов DML в сеансе с помощью команды ALTER SESSION ENABLE PARALLEL DML.

Если входные данные представлены в обычном файле, можно также обратиться к нему как к внешней таблице, а затем вставлять данные в сжатую таблицу так же, как из промежуточной таблицы. (Обсуждение внешних таблиц выходит за рамки этой статьи.)

Можно также использовать оператор CREATE TABLE ... AS SELECT для создания сжатой таблицы и вставки в нее данных за один шаг. Вот пример:

CREATE TABLE SALES_HISTORY_COMP
COMPRESS
AS SELECT * FROM SALES_HISTORY;

Если не использовать соответствующий метод загрузки или вставки данных, данные в таблице окажутся не сжатыми, хотя для таблицы и определен атрибут COMPRESS. Например, если использовать обычную загрузку (conventional path) с помощью SQL*Loader или обычные операторы INSERT, данные не будут сжиматься.
Когда использовать сжатие таблиц

Применяемый сервером Oracle алгоритм принятия решения о том, сжимать данные таблицы или не сжимать, приводит к определенным выводам об особенностях приложений, больше всего подходящих для сжатия таблиц. Как было описано выше, данные в таблице с атрибутом COMPRESS сжимаются только при непосредственной загрузке или при вставке с использованием подсказки append и распараллеливанием. Данные, вставленные обычными операторами INSERT, останутся не сжатыми.

В системах оперативной обработки транзакций (online transaction processing - OLTP) данные обычно вставляются обычными операторами INSERT. В результате, от использования сжатия для соответствующих таблиц большого преимущества не будет. Сжатие таблиц больше всего подходит для таблиц только для чтения, данные в которые загружаются один раз, а читаются - многократно. Таблицы, используемые при организации хранилищ данных, например, прекрасно подходят для сжатия.

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

Наконец, надо учесть последствия удаления строки при использовании сжатия таблицы. При удалении строки в сжатой таблице сервер освобождает место, занимаемое строкой в блоке. Это свободное место может быть повторно использовано при любой последующей вставке. Однако поскольку строка, вставленная в обычном режиме, не сжимается, маловероятно, что она поместится в освободившееся от сжатой строки место. Значительное количество последовательно выполняемых операторов DELETE и INSERT может вызвать фрагментацию и дискового пространства при этом будет напрасно использоваться больше, чем удалось сэкономить за счет сжатия.

 
« Предыдущая статья   Следующая статья »