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>