1. 程式人生 > >oracle 表壓縮詳細介紹

oracle 表壓縮詳細介紹

前言:

       表壓縮應該是從10g開始支援的吧,oracle 11g exadata將這個特性用到了極點,並大力推廣壓縮技術,在現代機器cpu效能井噴的狀態下,對IO,記憶體佔用的減少顯得尤為重要,壓縮技術肯定是未來的一種普遍技術,現在這個技術也越來越成熟,那就讓我們在以後的維護過程中用起來,早日實現這個功能的普及,福利DBA。

        oracle 12c同樣對壓縮技術進行了支援,下面是各種壓縮方法的優缺點,語法和介紹:

基本表壓縮        壓縮級別高       cpu消耗少                       適合DSS             語法ROW STORE COMPRESS[BASIC]         未使用direct-path 插入和更新資料將不壓縮
高階壓縮            壓縮級別高       cpu消耗少                       適合OLTP DSS  語法ROW STORE COMPRESS ADVANCED 同上
資料倉庫壓縮   (混合列壓縮) 壓縮級別更高 cpu消耗高 適合dss              語法COLUMN STORE COMPRESS FOR QUERY [LOW|HIGH]   高cpu,不使用direct-path是行級別儲存,而非列格式,壓縮級別將降低
歸檔壓縮          (混合列壓縮)  壓縮級別最高 cpu消耗最高 適合歸檔        語法COLUMN STORE COMPRESS FOR ARCHIVE[LOW|HIGH] 同上

各種壓縮技術優缺點:

基本表壓縮適合direct path 插入和受限資料型別sql
高階行壓縮支援所有的資料型別和所有sql

混合列壓縮適合不頻繁的update

歸檔壓縮僅適合direct path inserted,傳統的插入和更新也是支援的,不過得使用ADO(automatic data optimization)策略移動行達到要求的混合列壓縮級別

總結:大家可以發現高階行壓縮是理想壓縮方式,其他級別都是冷門壓縮,根據情況使用

測試一下吧
我的環境:oracle 12c for linux enterprise 5 +file system   --single instance

SQL> create table tt (id number) row store compress basic; --成功
SQL> create table tt (id number) row store compress advanced; --成功
SQL> create table tt (id number) column store compress for query high; --報錯,發現普通儲存不支援,只適合exadata上使用

create table tt (id number) column store compress for query high
*
ERROR at line 1:
ORA-64307:  Exadata Hybrid Columnar Compression is not supported for
tablespaces on this storage type
SQL> create table tt (id number) column store compress for archive high; --報錯同上

SQL> create table tt (id number);

Table created.

SQL> alter table tt row store compress advanced; --表後期可以來指定壓縮級別

Table altered.

SQL>

總結:發現有點遺憾的是資料倉庫級壓縮和歸檔壓縮在普通庫上不支援,我們再一次受限制了

alter table 修改表為壓縮,隻影響後邊的插入和更新操作,以前的資料不進行操作。
alter table move會將所有的資料進行壓縮。
alter table ... nocompress;  --取消表壓縮,但是已經壓縮的資料是不會自己解壓縮的,新資料將會使用Uncompressed

column store compress for query high  是預設倉庫級壓縮,提供好的效能和壓縮級別,但是混合列只能在exadata storage上   
query low適合讀效能特別差的系統,他比query high要快

column store compress for archive low 是預設的歸檔壓縮模式,,,提供了高級別壓縮和理想的不頻繁的資料訪問,archive high適合和少資料訪問的情況

DBMS_COMPRESSION包幫助進行重要表的特殊壓縮方式實現期望的壓縮級別

CREATE TABLE sales_history ... ROW STORE COMPRESS;   --此語句預設使用的basic table 壓縮


手工測試一下,沒有資料庫機,就把basic compress和row advanced compress測試一下,看一下效果
SQL> select  segment_name,bytes/1024/1024 from user_segments;

SEGMENT_NAME                                                                                                                     BYTES/1024/1024
-------------------------------------------------------------------------------------------------------------------------------- ---------------
TEST                                                                                                                                       .0625
AA                                                                                                                                           192

SQL>
SQL>
SQL> create table aa_bas row store compress basic as select * from aa;

Table created.

SQL> create table aa_adv row store compress advanced as select * from aa;

Table created.

SQL>  select  segment_name,bytes/1024/1024 from user_segments;

SEGMENT_NAME                                                                                                                     BYTES/1024/1024
-------------------------------------------------------------------------------------------------------------------------------- ---------------
TEST                                                                                                                                       .0625
AA                                                                                                                                           192
AA_BAS                                                                                                                                        47
AA_ADV                                                                                                                                        53

--新增幾條在exadata中執行的命令,以供參考:

SQL> create table a_ql compress for query low as select * from a;


Table created.

SQL> create table a_qh compress for query high as select * from a;


Table created.

SQL> create table a_al compress for archive low as select * from a;


Table created.


SQL> create table a_ah compress for archive high as select * from a;


Table created.

SQL>  create table a_basic compress for oltp as select * from a;


Table created.

SQL> create table a_basic compress   as select * from a;


Table created.

SQL> select owner,table_name,compress_for from dba_tables
  2  where compression='ENABLED'
  3  ;


OWNER                          TABLE_NAME                     COMPRESS_FOR
------------------------------ ------------------------------ ------------
SYSMAN                         MGMT_METRICS                   OLTP
SYSMAN                         MGMT_POLICIES                  OLTP
TEST                           A_QH                           QUERY HIGH
TEST                           A_QL                           QUERY LOW
TEST                           A_AL                           ARCHIVE LOW
TEST                           A_AH                           ARCHIVE HIGH
TEST                           A_OLTP                         OLTP
TEST                           A_BASIC                        BASIC


8 rows selected.


SQL>