DB2 9.1引入行深度壓縮,9.7進一步推出索引壓縮。兩者目標一致:減少磁盤佔用、降低I/O、提升緩衝池命中率、縮短備份恢復時間、綜合降低IT成本。本文聚焦索引壓縮實戰應用。
CREATE TABLE t1 (col1 INT) COMPRESS YES;
CREATE INDEX idx_col1 ON t1(col1);
-- 索引壓縮自動啟用
驗證:
SELECT INDNAME, TABNAME, COMPRESSION, PCTPAGESSAVED
FROM SYSCAT.INDEXES WHERE TABNAME='T1';
輸出COMPRESSION='Y'確認啟用。
CREATE TABLE t2 (col1 INT); -- 表不壓縮
CREATE INDEX idx_col2 ON t2(col1) COMPRESS YES; -- 索引單獨壓縮
ALTER INDEX idx_col2 COMPRESS YES;
REORG INDEXES ALL FOR TABLE t2;
RUNSTATS ON TABLE t2 AND INDEXES ALL;
關鍵點:ALTER後必須REORG重建索引,否則新數據仍以非壓縮格式存儲。DB2不允許同一索引共存壓縮/非壓縮頁。
-- 插入測試數據
INSERT INTO t2 (col1)
WITH TEMP(COUNTER, col1) AS (
VALUES (0, INT(RAND()*1000))
UNION ALL
SELECT COUNTER+1, INT(RAND()*1000) FROM TEMP WHERE COUNTER+1 < 10000
) SELECT col1 FROM TEMP;
-- 收集統計
RUNSTATS ON TABLE t2 AND INDEXES ALL;
SELECT INDNAME, COMPRESSION, PCTPAGESSAVED FROM SYSCAT.INDEXES WHERE TABNAME='T2';
-- 初見 PCTPAGESSAVED=0(未REORG)
-- 重組索引
REORG INDEXES ALL FOR TABLE t2;
RUNSTATS ON TABLE t2 AND INDEXES ALL;
SELECT INDNAME, COMPRESSION, PCTPAGESSAVED FROM SYSCAT.INDEXES WHERE TABNAME='T2';
-- 結果:PCTPAGESSAVED=40(節省40%頁面)
| 數據特徵 | 壓縮效果 | 原理 |
|---|---|---|
| 大量重復鍵值 | 極佳 | RID列表壓縮存儲 |
| 索引鍵前綴高度相似 | 優秀 | 前綴字典壓縮 |
| 低基數列(性別、狀態、類型) | 好 | 重復值多 |
| 高基數唯一鍵(主鍵、UUID) | 差/無效 | 無重復模式,甚至擴大 |
| 隨機分布、無規律數據 | 差 | 壓縮開銷>收益 |
| 系統瓶頸 | 建議 | 理由 |
|---|---|---|
| I/O瓶頸、CPU閒置 | ✅ 啟用 | 以CPU換I/O,性能顯著提升 |
| CPU瓶頸、高併發OLTP | ⚠️ 謹慎/禁用 | 壓縮解壓增加CPU,可能加劇瓶頸 |
| 數據倉庫、批量載入 | ✅ 啟用 | 順序寫入、查詢掃描大表,I/O收益大 |
| 小表、高頻點查詢 | ❌ 不啟用 | 表常駐內存,壓縮無意義且增CPU |
RUNSTATS更新PCTPAGESSAVED監控壓縮比REORGCHK檢查是否需重組REORG INDEX回收空間BACKUP DATABASE ... COMPRESS)DB2 9.7索引壓縮是「以CPU換I/O」的經典權衡。低基數、重復前綴、I/O瓶頸、CPU富餘場景收益最大。生產上線前必須壓測驗證CPU影響,建立基線對比。配合表壓縮使用,存儲成本可降40%-80%。