Advanced Compression - опция Oracle Database 11g Enterprise Edition, предоставляющая набор возможностей для сжатия данных, с целью снижения затрат, при сохранении или даже увеличении производительности. Благодаря ней значительно уменьшается занимаемый на носителях объем баз данных, как за счет сжатия данных простых типов (числовые и символьные), так и составных типов (документы, электронные таблицы, XML и другие файлы). Данная опция обеспечивает улучшенную компрессию для резервных копий базы данных, а так же включает в себя компрессию сетевого трафика для ускорения синхронизации Stand-by баз данных.
Преимущества использования сжатия:
Преимущества использования сжатия:
- 2-4-кратное уменьшение объема на системе хранения для всех видов окружения: промышленного, тестирования, разработки, резервных копий и т.д.
- Увеличение эффективности использования памяти, поскольку данные в памяти также хранятся в сжатом виде
- Минимальное влияние на производительность или полное его отсутствие при выполнении DML-операций за счет оптимизированной технологии сжатия
- Во многих случаях происходит ускорение выполнения запросов вследствие уменьшения операций ввода/вывода и более эффективного использования памяти
- Эффективное использование пропускной способности сети
- Полная прозрачность для приложений – не требуются менять приложения
Сжатие индексов:
- Достигается путем удаления дубликатов в литьевых блоках
- Подходит для неуникальных или составных индексов
- Обеспечивает сжатие в 2-5 раз
- COMPRESS и COMPRESS FOR DIRECT_LOAD OPERATIONS (базовое сжатие)– позволяет сжимать данные загруженные посредством direct insert. Данный вариант подходит для хранилищ данных (data warehouse).
- COMPRESS FOR OLTP – в реальном времени сжимает данные любых операций DML. Специальный алгоритм минимизирует нагрузку на систему во время записи, делая возможным использование данного вида компрессии в высоконагруженных транзакционных базах.
- Оценивает OLTP компрессию для таблиц, выдает рекомендации где она будет оптимальна
- при работе генерирует REDO, так как создает промежуточные таблицы
Ограничения:
- Для использования Advanced Compression требуется СУБД Oracle 11g Enterprise Edition.
- В случае включения сжатия посредством Alter table, сжимаются только лишь новые данные.
- Добавление столбцов:
- Базовое сжатие – невозможно задать значение «по умолчанию» при
- OLTP – задание значений «по умолчанию» возможно, однако при этом обязателен параметр NOT NULL
- Удаление столбцов:
- Базовое сжатие – удаление столбцов не поддерживается.
- OLTP – удаление возможно, однако oracle физически не удаляет такие столбцы, а помечает их как UNUSED.
- Применение сжатия увеличивает нагрузку на CPU.
- Применение базового сжатия изменяет PCT_FREE для таблиц на 0
- При применении сжатия таблиц невозможно использования online table shrink
- Методики Advanced Compression не применимы к secure files large objects. Для сжатия таких объектов применяются другие методы.
Использование
Compression Advisor.
- Таблицы, которые занимают большой объем дискового
пространства получат наибольшую выгоду от применения компрессии.
-- определяем размеры
таблиц
SELECT segment_name, SUM (bytes) / 1024 / 1024
FROM dba_segments
WHERE owner = 'DBAX' AND segment_type = 'TABLE'
GROUP BY segment_name
ORDER BY 2
...
TEST_NO_COMPRESS 552
...
Для определения места, которое будет освобождено применим процедуру - DBMS_COMPRESSION.GET_COMPRESSION_RATIO:
Для определения места, которое будет освобождено применим процедуру - DBMS_COMPRESSION.GET_COMPRESSION_RATIO:
set serveroutput on
declare
v_blkcnt_cmp pls_integer;
v_blkcnt_uncmp pls_integer;
v_row_cmp pls_integer;
v_row_uncmp pls_integer;
v_cmp_ratio number;
v_comptype_str varchar2(60);
begin
dbms_compression.get_compression_ratio(
scratchtbsname => upper('USERS'),
ownname => 'DBAX',
tabname => upper('TEST_NO_COMPRESS'),
partname => NULL,
comptype =>
dbms_compression.comp_for_oltp,
blkcnt_cmp => v_blkcnt_cmp,
blkcnt_uncmp => v_blkcnt_uncmp,
row_cmp => v_row_cmp,
row_uncmp => v_row_uncmp,
cmp_ratio => v_cmp_ratio,
comptype_str => v_comptype_str);
dbms_output.put_line('Estimated Compression
Ratio: '||to_char(v_cmp_ratio));
dbms_output.put_line('Blocks
used by compressed sample: '||to_char(v_blkcnt_cmp));
dbms_output.put_line('Blocks used by
uncompressed sample: '||to_char(v_blkcnt_uncmp));
end;
/
Estimated Compression Ratio: 2.4
Blocks used by compressed sample: 778
Blocks used by uncompressed sample: 1920
Estimated Compression Ratio: 2.4
Blocks used by compressed sample: 789
Blocks used by uncompressed sample: 1934
Blocks used by compressed sample: 778
Blocks used by uncompressed sample: 1920
Estimated Compression Ratio: 2.4
Blocks used by compressed sample: 789
Blocks used by uncompressed sample: 1934
Предположительный коэффициент сжатия таблицы более чем в 2 раза.
Для подтверждения этих результатов создадим таблицу с
изначально заданным параметром компрессии.
CREATE TABLE DBAX.TEST_COMPRESS
COMPRESS FOR OLTP AS SELECT * from DBAX.TEST_NO_COMPRESS
SELECT SEGMENT_NAME, SUM (bytes) / 1024 / 1024
FROM dba_segments
WHERE OWNER = 'DBAX' AND segment_type = 'TABLE'
AND SEGMENT_NAME in ('TEST_COMPRESS','TEST_NO_COMPRESS')
GROUP BY SEGMENT_NAME
...
TEST_NO_COMPRESS 552
TEST_COMPRESS 232
...
...
Размер таблицы уменьшился с 552 до 232 Мб.
Выборка данных из таблицы с иcпользованием полного перебора (full table scan) для несжатой таблицы:
SQL> set autotrace on
SQl> exec dbms_stats.gather_schema_stats(ownname=>'DBAX');
PL/SQL procedure successfully completed.
SQL> ALTER SYSTEM FLUSH BUFFER_CACHE;
System altered.
SQL> set timi on
SQL> SELECT count(*) FROM DBAX.TEST_NO_COMPRESS;
COUNT(*)
----------
5263373
Elapsed: 00:00:12.23
Execution Plan
----------------------------------------------------------
Plan hash value: 2582414440
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 19185 (1)| 00:03:5
| 1 | SORT AGGREGATE | | 1 | |
| 2 | TABLE ACCESS FULL| TEST_NO_COMPRESS | 5263K| 19185 (1)| 00:03:5
----------------------------------------------------------------------------
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
70002 consistent gets
69999 physical reads
0 redo size
349 bytes sent via SQL*Net to client
472 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
И для сжатой:
SQL> alter system flush buffer_cache;
System altered.
SQL> SELECT count(*) FROM DBAX.TEST_COMPRESS;
COUNT(*)
----------
5263373
Elapsed: 00:00:03.59
Execution Plan
----------------------------------------------------------
Plan hash value: 1764017733
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 8078 (2)| 00:01:37 |
| 1 | SORT AGGREGATE | | 1 | | |
| 2 | TABLE ACCESS FULL| TEST_COMPRESS | 5263K| 8078 (2)| 00:01:37 |
----------------------------------------------------------------------------
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
29256 consistent gets
29254 physical reads
0 redo size
349 bytes sent via SQL*Net to client
472 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
SQl> exec dbms_stats.gather_schema_stats(ownname=>'DBAX');
PL/SQL procedure successfully completed.
SQL> ALTER SYSTEM FLUSH BUFFER_CACHE;
System altered.
SQL> set timi on
SQL> SELECT count(*) FROM DBAX.TEST_NO_COMPRESS;
COUNT(*)
----------
5263373
Elapsed: 00:00:12.23
Execution Plan
----------------------------------------------------------
Plan hash value: 2582414440
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 19185 (1)| 00:03:5
| 1 | SORT AGGREGATE | | 1 | |
| 2 | TABLE ACCESS FULL| TEST_NO_COMPRESS | 5263K| 19185 (1)| 00:03:5
----------------------------------------------------------------------------
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
70002 consistent gets
69999 physical reads
0 redo size
349 bytes sent via SQL*Net to client
472 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
И для сжатой:
SQL> alter system flush buffer_cache;
System altered.
SQL> SELECT count(*) FROM DBAX.TEST_COMPRESS;
COUNT(*)
----------
5263373
Elapsed: 00:00:03.59
Execution Plan
----------------------------------------------------------
Plan hash value: 1764017733
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 8078 (2)| 00:01:37 |
| 1 | SORT AGGREGATE | | 1 | | |
| 2 | TABLE ACCESS FULL| TEST_COMPRESS | 5263K| 8078 (2)| 00:01:37 |
----------------------------------------------------------------------------
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
29256 consistent gets
29254 physical reads
0 redo size
349 bytes sent via SQL*Net to client
472 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
Комментарии
Отправить комментарий