Oracle表的壓縮

531968912發表於2017-12-11
隨著資料庫的增長,我們可以考慮使用oracle的表壓縮技術。表壓縮可以節省磁碟空間、減少data buffer cache的記憶體使用量、並可以顯著的提升讀取和查詢的速度。當使用壓縮時,在資料匯入和DML操作時,將導致更多的CPU開銷,然而,由於啟用壓縮而減少的I/O需求將抵消CPU的開銷而產生的成本。

表的壓縮對於應用程式來說是完全透明的,對於決策支援系統(DSS)、聯機事務處理系統(OLTP)、歸檔系統(Archive Systems)來說表的壓縮是有益處的。我們可以壓縮表空間,表和分割槽。如果壓縮表空間,那麼在預設的情況下,表空間上建立的所有表都將被壓縮。只有在表執行插入、更新或批次資料載入時,才會執行資料的壓縮操作。

一、表壓縮的方法
Oracle提供了一下幾種型別的表壓縮方法:
1、Basic Compression:壓縮等級High,CPU開銷較小
2、OLTP Compression:壓縮等級High,CPU開銷較小
3、Warehouse Compression:壓縮等級Higher,CPU開銷較大(取決於壓縮引數是Low還是High)
4、Archive Compression:壓縮等級Highest,CPU開銷很大(取決於壓縮引數是Low還是High)

當使用Basic Compression,warehouse Compression,Archive Compression型別的壓縮時,盡在發生批次資料匯入時才會執行壓縮。OLTP Compression被用於聯機事務處理系統,可以對任意的SQL操作執行資料壓縮。Warehouse Compression和Archive Compression可以獲得很高的壓縮等級,因為它們採用了Hybrid Columnar(混合列)壓縮技術,Hybrid Columnar採用一種改良的列的儲存形式替代一行為主的儲存形式。Hybird Columnar技術允許將相同的資料儲存在一起,提高了壓縮演算法的效率。當使用混合列壓縮演算法時,將導致更多的CPU開銷,因此這種壓縮技術適用於更新不頻繁的資料。

表的壓縮特徵:
表壓縮方法 建立和修改表壓縮的語法 直接路徑插入 說明
Basic Compression compression [basic] 直接路徑插入的資料才會被壓縮 compression和compression basic是等價的,未使用直接路徑插入的資料不會被壓縮
OLTP Compression compression for oltp 不要求 使用Insert和Update的資料也將被壓縮
Warehouser Compression compression for query   [Low|High] 直接路徑插入的資料才會被壓縮
CPU開銷高,未採用直接路徑插入的行插入和行更新以行格式儲存,會降低壓縮等級(Low)
Archive Compression compression for archive [Low|High]
直接路徑插入的資料才會被壓縮
CPU開銷高,未採用直接路徑插入的行插入和行更新以行格式儲存,會降低壓縮等級(Low)

之前未壓縮的表可以透過alter table ... compression ... 語句進行壓縮。在這種情況下,壓縮啟用前的記錄不會被壓縮,只有新插入或更新的資料才會進行壓縮。同樣,透過alter table ... nocompression ...語句解除對一個表的壓縮,表內已壓縮的資料還會繼續保持壓縮的狀態,新插入的資料就不再被壓縮。

在warehouse compression模式下,compression for query high是預設的;在archive compression模式下,compression for archive low是預設的。

二、壓縮和分割槽表
一個表可以有壓縮的分割槽和未壓縮的分割槽,不同的分割槽可以使用不同的壓縮方法。可以採用下列的方法改變分割槽的壓縮方法:
1、alter table ... modify partition ... compress ... ,該方法僅適用於新插入的資料。
2、alter table ... move partition ... compress ... ,該方法適用於新插入的資料和已存在的資料。

確定表是否被壓縮:
SQL> select table_name,compression,compress_for from user_tables;
TABLE_NAME                     COMPRESS COMPRESS_FOR
------------------------------ -------- ------------
COUNTRIES                      DISABLED BASIC                 //這裡比較困惑,既然表沒有啟用壓縮,為什麼compress_for裡的壓縮方法確實basic呢?
JOBS                           DISABLED
EMPLOYEES                      ENABLED  BASIC
LOCATIONS                      DISABLED
DEPARTMENTS                    DISABLED
JOB_HISTORY                    DISABLED
REGIONS                        DISABLED

三、在壓縮表上新增和刪除列
在壓縮表上新增和刪除列有如下限制:
1、對於compression basic型別的壓縮,不能對新新增的列指定預設值。例如:

SQL> alter table employees compress basic;
Table altered.

SQL> alter table employees add (a varchar(10) default 'AAA');
alter table employees add (a varchar(10) default 'AAA')
                           *
ERROR at line 1:
ORA-39726: unsupported add/drop column operation on compressed tables

SQL> alter table employees add (b number);
Table altered.

2、對於OLTP型別的壓縮,如果為新新增的列指定預設值,則該列必須被設定為 NOT NULL,為可以為空的列新增預設值不被支援。對於這一點,我認為文件的描述是錯誤的,原文是這樣的:OLTP compression - If a default value is specified for an added column, then the column must be NOT NULL. Added nullable columns with default values are not supported.   下面透過一個實驗來驗證

SQL> alter table employees compress for oltp;
Table altered.

SQL> alter table employees add (c int default 10);
Table altered.

3、對於compression basic型別的壓縮,不支援列的刪除操作,例如:

SQL> alter table employees compress basic;
Table altered.

SQL> alter table employees drop column c;
alter table employees drop column c
                                  *
ERROR at line 1:
ORA-39726: unsupported add/drop column operation on compressed tables

4、對於OLTP型別的壓縮,能夠支援列的刪除操作,但是在資料庫內部將列標記為unused狀態,避免長時間的解壓和重新壓縮的操作。

SQL> alter table employees compress for oltp;
Table altered.

SQL> alter table employees drop column c;
Table altered


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25462274/viewspace-2148566/,如需轉載,請註明出處,否則將追究法律責任。

相關文章