隨著資料量增長,表壓縮成為節省儲存、減少記憶體佔用、提升查詢效能的關鍵手段。Oracle 11g R2 提供四種壓縮等級:Basic、OLTP、Warehouse (Hybrid Columnar)、Archive (Hybrid Columnar)。其中 Hybrid Columnar 僅支援 Exadata。本文詳細解析各壓縮方式的語法、觸發條件、CPU 開銷、分區表支援、壓縮狀態查詢、匯入匯出、還原轉換與限制事項。
| 方式 | 壓縮等級 | CPU 開銷 | 適用場景 | 觸發壓縮操作 | 備註 |
|---|---|---|---|---|---|
| Basic | High | Minimal | DSS (決策支援) | 僅直接路徑載入 | 不支援 DML 壓縮,PCT_FREE=0 |
| OLTP | High | Minimal | OLTP、DSS | 直接路徑 + 傳統 DML | 支援所有 SQL 操作壓縮,PCT_FREE=10 |
| Warehouse (HCC) | Higher | Higher | DSS | 僅直接路徑載入 | 需 Exadata,列式儲存,更新行轉列式 |
| Archive (HCC) | Highest | Highest | 歸檔 | 僅直接路徑載入 | 需 Exadata,極高壓縮比,極少更新 |
INSERT /*+ APPEND */, CTAS, SQL*Loader 直接路徑, 並行 INSERT)。傳統 INSERT/UPDATE 不壓縮。-- Basic CREATE TABLE sales_history (...) COMPRESS BASIC; CREATE TABLE sales_history (...) COMPRESS; -- 等同 -- OLTP CREATE TABLE orders (...) COMPRESS FOR OLTP; -- Warehouse (HCC) CREATE TABLE sales_history (...) COMPRESS FOR QUERY [LOW|HIGH]; -- 預設 HIGH -- Archive (HCC) CREATE TABLE sales_history (...) COMPRESS FOR ARCHIVE [LOW|HIGH]; -- 預設 LOW
INSERT /*+ APPEND */ INTO sales_history SELECT * FROM sales WHERE cust_id = 8890; COMMIT;
ALTER TABLE ... MODIFY PARTITION ... COMPRESS ...ALTER TABLE ... MOVE PARTITION ... COMPRESS ... 或線上重定義 (DBMS_REDEFINITION)-- 表級 SELECT TABLE_NAME, COMPRESSION, COMPRESS_FOR FROM USER_TABLES; -- 結果:ENABLED / DISABLED + BASIC / OLTP / QUERY HIGH / ARCHIVE LOW -- 分區級 SELECT TABLE_NAME, PARTITION_NAME, COMPRESSION, COMPRESS_FOR FROM USER_TAB_PARTITIONS;
SELECT DECODE(DBMS_COMPRESSION.GET_COMPRESSION_TYPE(
OWNNAME => 'HR', TABNAME => 'EMPLOYEES', ROW_ID => 'AAAVEIAAGAAAABTAAD'),
1, 'No Compression',
2, 'Basic or OLTP',
4, 'HCC Query High',
8, 'HCC Query Low',
16, 'HCC Archive High',
32, 'HCC Archive Low',
'Unknown') FROM DUAL;
ALTER TABLE ... MOVE ... COMPRESS FOR ... (期間鎖表,不可 DML)DBMS_REDEFINITION 線上重定義 (不鎖表,需額外空間)ALTER TABLESPACE ... SET DEFAULT COMPRESS ...IMPDP 預設保留壓縮屬性,非 HCC 表空間匯入 HCC 表會報錯TRANSFORM=SEGMENT_ATTRIBUTES:N 移除壓縮屬性匯入ALTER TABLE MOVE COMPRESS FOR OLTP / NOCOMPRESS)PCT_FREE=0;OLTP:PCT_FREE=10 (可覆蓋)UNUSED 避免解壓/重壓開銷ALTER TABLE MOVE 或線上重定義「打包」壓縮