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

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

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

Используйте сжатие таблиц для экономии места на диске и повышения производительности запросов. Большинство систем поддержки принятия решений (DSS) обычно используют большие объемы данных, которые хранятся в нескольких очень больших таблицах. По мере развития таких систем требования к дисковому пространству могут быстро расти. В настоящее время все более распространены хранилища данных объемом в сотни терабайт.

В случае проблем с дисковым пространством возможность сжатия таблиц в oracle 9i Release 2 может значительно уменьшить объем дискового пространства, используемого таблицами базы данных. , а в некоторых случаях повысить производительность запросов.

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

Как это реализовано

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

Сжатие таблицы не влияет на пользователя или разработчика приложения. Разработчики смотрят на таблицу одинаково, независимо от того, сжата она или нет, поэтому запросы sql не должны изменяться, когда мы выбираем ее сжатие. Параметры сжатия таблиц обычно устанавливаются и изменяются администраторами или архитекторами баз данных с минимальным участием разработчика или пользователя.
Как создать сжатую таблицу

Ключевое слово compress в операторе compose table используется для создания сжатая таблица. Ключевое слово compress требует, чтобы сервер oracle по возможности сохранял сжатые строки таблицы. Вот пример команды create table compress:

 create table sales_history_comp (
part_id varchar2 (50) не равно нулю,
store_id varchar2 (50) не равно нулю,
sales_date date date не нулевая,
количество число (10,2) не нуль
)
compress; 

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

 alter table sales_history_comp compress; 

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

 select table_name, сжатие из user_tables;

сжатие table_name
------------------ -----------
sales_history отключена
sales_history_comp enabled 

Атрибут сжатия также может быть установлен на уровне табличного пространства, как при создании (с помощью команды create tablespace), так и позже (с помощью команды alter tablespace). Атрибут сжатия наследуется, как и параметры хранилища. При создании таблицы в табличном пространстве атрибут сжатия этого табличного пространства наследуется. Чтобы определить, имеет ли табличное пространство установленный атрибут сжатия, запросите словарь данных в представлении dba_tablespaces и проверьте значение столбца def_tab_compression, как в примере ниже:

 select tablespace_name,
def_tab_compression
из dba_tablespaces;

tablespace_namedef_tab_compression
--------------- -------------------
data_ts_01 неактивен
index_ts_01 disabled 

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

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

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

Кроме того, чтобы гарантировать фактическое сжатие данных, необходимо использовать соответствующий метод загрузки или вставки данных в таблицу. Сжатие данных происходит только во время массовой загрузки или массовой вставки данных с использованием одного из следующих четырех методов:
Прямой загрузчик sql *
Последовательная вставка и добавление
Параллельная вставка

 создать таблицу. .as select 

Метод прямого загрузчика sql * является наиболее удобным способом загрузки данных в таблицу, если данные доступны в текстовом файле. Вот пример:

 $ sqlldr sanjay/sanjay @ proddb control = sales_history.ctl direct = true 

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

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

 insert/* + append */
в sales_history_comp
select * from sales_history; 

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

 alter session enable parallel dml;
вставить/* + параллельный (продаж_история_комп, 4) */
в sales_history_comp
select * from sales_history; 

При использовании параллельной вставки сначала включите параллельные команды dml в сеансе с помощью alter session enable parallel dml.

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

Вы также можете использовать команду создания таблицы & # 8230; as выберите, чтобы создать сжатую таблицу и вставить в нее данные за один шаг. Вот пример:

 создайте таблицу sales_history_comp
сжатие
as select * from sales_history; 

Если вы не используете соответствующий метод загрузки или вставки, данные в таблице не будут сжаты, даже если для таблицы определен атрибут сжатия. Например, если вы используете обычный загрузчик (обычный путь) с загрузчиком sql * или обычный оператор вставки, данные не сжимаются.

Когда использовать сжатие таблицы

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

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

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

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

Сжатие существующей таблицы без сжатия

Существующие таблицы без сжатия может быть сжат с помощью Alter Таблица & # 8230 команды; Двигаться. Например, несжатый таблица Sales_History_Temp может быть уменьшена с помощью следующего оператора: <предварительно> Alter

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

Таблица Sales_History_Temp
Переместить КОМПРЕСС; Оператор Alter Table & # 8230; ПЕРЕМЕЩЕНИЕ также может быть использован для распаковки таблицы, как показано в следующем примере: <предварительно> Alter Table Sales_History_Temp
Перемещение Nocompress; <р> При использовании Alter Table & # 8230 команду; MOVE устанавливает монопольную блокировку на таблицу, которая позволяет что-либо с таблицей любого DML заявления в процессе его эксплуатации. Эта потенциальная проблема устраняется с помощью онлайн таблицы переосмысление, введенный в Oracle9i.

материализовались вид сжатия

Виды материализованных могут быть сжаты так же, как столы. Следующее выражение создает сжатый материализованное представление:
Создать материализованное представление MV_SALES_COMP КОМПРЕСС AS SELECT P.PART_NAME, H.STORE_ID, H.SALE_DATE, H.QUANTITY ОТ SALES_HISTORY Н, ЧАСТИ Р ГДЕ P.PART_ID = h.PART_ID;

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

<предварительно> ALTER материализованное представление MV_SALES COMPRESS;

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

Сжатие поперечного сечения table1

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

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

на листинге 2, две секции таблицы (Sales_Q1_03 и Sales_Q2_03) сжаты, а остальные два несжатый. Обратите внимание, что сжатие атрибутов устанавливаются на уровне раздела перезаписи атрибутов, установленные для тех же секций на уровне таблицы. Если атрибут сжатия не указан для секции, то этот раздел наследует значение из определения на уровне таблицы. На листинге 2, потому что для разделов Sales_Q3_03 и SALES_Q4_03 никаких признаков компрессии не было указано, эти две секции наследуют значение из определения таблицы (который в данном случае является стандартным Nocompress «).

таблицы раздел имеет один уникальные таблицы преимущества наряду со сжатием одним из полезных способов таблицы таблиц и # 8212;. это помещать данные , которые будут изменено (вставлен, обновление и удаления) в отдельных секциях, а также в других разделах на место только Read- только данные. Например, в определении таблицы на листинг 2 данных о продажахразделены по значению столбца sales_date, поэтому хронологическая информация о продажах для каждого квартала хранится в отдельном разделе. В этом примере данные о продажах за первый (q1) и второй (q2) кварталы 2003 г. изменить нельзя, поэтому они помещаются в сжатые разделы sales_q1_03 и sales_q2_03. Данные о продажах за третий (q3) и четвертый (q4) кварталы все еще можно изменить, поэтому оставьте соответствующие разделы sales_q3_03 и sales_q4_03 несжатыми.

Если в конце третьего квартала 2003 года данные в sales_q3_03 станут доступны только для чтения , мы можем сжать этот раздел с помощью alter table & # 8230; переместите раздел, как показано ниже:

 изменить таблицу sales_part_comp
переместить раздел sales_q3_03 compress; 

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

 select table_name, partition_name,

сжатие
из user_tab_partitions;
имя_таблицы имя_раздела сжатие
---------------------------- -----------
sales_part_comp sales_q4_03 неактивен
sales_part_comp sales_q1_03 включен

sales_part_comp sales_q2_03 включен

sales_part_comp sales_q3_03 enabled 

Преимущества

Основная причина использования сжатия таблиц — экономия места на диске. Сжатый стол обычно занимает меньше места. Чтобы проиллюстрировать этот момент, рассмотрим следующие из двух таблиц: одну несжатую (sales_history) и одну сжатую (sales_history_comp).

Обе эти таблицы были загружены непосредственно загрузчиком sql * из текстового файла с двумя миллионами строк. После выполнения обеих рабочих нагрузок сжатая таблица занимала почти половину дискового пространства, чем несжатая таблица. См. Анализ в листинге 3.

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

Отчет sqltrace/tkprof показывает, что мой запрос к сжатой таблице требовал меньше физических и логических операций ввода-вывода, чем эквивалентный запрос к несжатой таблице, и поэтому был выполнен быстрее. .

Снижение производительности

Когда вы выполняете операцию массовой загрузки, сжатие таблицы требует дополнительной обработки необходимо выполнить дополнительные шаги. Чтобы измерить влияние сжатия на производительность, я провел тест, в котором загрузил миллион строк (путем прямой загрузки с помощью загрузчика sql *) в две идентичные таблицы: сжатую и несжатую. В таблице 1 показаны результаты, полученные из файлов журнала загрузчика sql *, и показано, сколько времени потребовалось для загрузки данных в каждую из таблиц.
имя таблицы Количество строк Метод загрузки Сжат?
sales_history 1000000 Немедленно без сжатия 00: 00: 21.12
sales_history_comp 1000000 Немедленное сжатие 00: 00: 47.77

Таблица 1. Сравнение времени загрузки сжатых и несжатых таблиц

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

Complete

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

.

Оцените статью