К основному контенту

Oracle Compression Advisor

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. Специальный алгоритм минимизирует нагрузку на систему во время записи, делая возможным использование данного вида компрессии в высоконагруженных транзакционных базах.
Использование Compression Advisor:
  • Оценивает 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.
  1. Таблицы, которые занимают большой объем дискового пространства получат наибольшую выгоду от применения компрессии.
-- определяем размеры таблиц
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:
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

Предположительный коэффициент сжатия таблицы более чем в 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

Комментарии

Популярные сообщения из этого блога

Установка и настройка pgAgent(планировщика заданий PostgreSQL)

Установка pgAgent Последняя версия скрипта для установки агента  тут . Перенести инструкцию по агенту в отдельную тему. 1. Создать пользователя ОС, и сделать ему домашний каталог: useradd -s /bin/false -r -M pgagent mkdir /home/pgagent 2. Установить и настроить демон: yum install pgagent_94 При наличии ошибок вида (была на Oracle Linux 6.8) Error: Package: pgagent_94-3.4.0-1.rhel6.x86_64 (pgdg94)            Requires: libwx_baseu-2.8.so.0(WXU_2.8)(64bit) Нужно установить EPEL systemctl enable pgagent_94 chown pgagent:pgagent /var/log/pgagent_94.log 3. Установить схему агента в базе: sudo -u postgres psql -f /usr/share/pgagent_94-3.4.0/pgagent.sql postgres 4. Создать файл паролей для подключения агента к базе. vi /home/pgagent/.pgpass localhost:5432:*:postgres:postgres chown pgagent.pgagent /home/pgagent -R chmod 600 /home/pagent/.pgpass 5. Запустить и проверить работу агента systemctl start pgagent_94.service systemctl status pga

Включение логирования для Haproxy

Изначально логирование в syslog в HaProxy отключено. Ниже пример настройки логирования для ОС Centos 7. Настройка: Добавить строку  log 127.0.0.1 local2 в секцию global файла /etc/haproxy/haproxy.cfg Раскомментировать $ModLoad imudp и $UDPServerRun 514 в файле  /etc/rsyslog.conf Создать файл  /etc/rsyslog.d/haproxy.conf со следующим содержимым:  local2.* /var/log/haproxy.log Перезапустить rsyslog и haproxy.

Использование oraenv для установки окружения.

Для настройки окружения в Linux можно все параметры базы указать в .bash_profile: ORACLE_HOME=/app/oracle/product/11.2.0.4/dbhome_1 export ORACLE_HOME ORACLE_BASE=/app/oracle export ORACLE_BASE ORACLE_SID=orcl export ORACLE_SID PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin export PATH Но лучше использовать для этих целей утилиту oraenv. oraenv берет данные из файла /etc/oratab orcl:/app/oracle/product/12.1.0/dbhome_1:N И на ее основе задает параметры окружения: ORACLE_SID, ORACLE_BASE,ORACLE_HOME и PATH Использовать можно в интерактивном режиме: . oraenv ORACLE_SID = [orcl] ? orcl The Oracle base has been set to /app/oracle И в неинтерактивном режиме. Добавить в  .bash_profile: ORACLE_SID=orcl ORAENV_ASK=NO . oraenv Для ASM ситуация аналогичная. . oraenv ORACLE_SID = [orcl] ? +ASM1 The Oracle base has been set to /u01/app/oracle echo $ORACLE_HOME /app/11.2.0/grid