DB2 9.7 前,範圍分區表僅支持非分區(全局)索引,所有分區共享一棵 B+ 樹,導致:
DETACH/ATTACH PARTITION 需 SET INTEGRITY 重建全局索引,耗時、佔日誌、長鎖表。9.7 引入 分區索引:每個數據分區對應一個獨立索引分區,各自維護 B+ 樹,葉子 RID 僅指向本分區行。創建索引默認即為分區索引,除非:
UNIQUE 且索引鍵未包含所有分區鍵列。CREATE TABLE t1 (l_orderkey INT, l_partkey INT, l_suppkey INT, l_shipdate DATE, padding1 CHAR(30))
PARTITION BY RANGE(l_shipdate)
( PARTITION q1 STARTING '2008-01-01' ENDING '2008-03-31' IN DMS_D1,
PARTITION q2 STARTING '2008-04-01' ENDING '2008-06-30' IN DMS_D2,
PARTITION q3 STARTING '2008-07-01' ENDING '2008-09-30' IN DMS_D3,
PARTITION q4 STARTING '2008-10-01' ENDING '2008-12-31' IN DMS_D4 );
CREATE INDEX idx_nopart ON t1(l_orderkey) NOT PARTITIONED; -- 全局索引
CREATE INDEX idx_part ON t1(l_partkey) PARTITIONED; -- 分區索引
-- 數據分區
SELECT tabname, datapartitionname, datapartitionid, lowvalue, highvalue
FROM syscat.datapartitions WHERE tabname='T1';
-- 索引基本信息
SELECT tabname, indname, tbspaceid FROM syscat.indexes WHERE tabname='T1';
-- 索引分區
SELECT indname, datapartitionid FROM syscat.indexpartitions WHERE indname='IDX_PART';
關鍵發現:
IDX_NOPART 存放於首個數據分區表空間(DMS_D1,TBSPACEID=8)。IDX_PART 的 TBSPACEID=65530(特殊值),實際分佈於各數據分區同名表空間,syscat.indexpartitions 顯示 4 行,分區 ID 0-3。INDEX IN ts 子句在分區級指定索引表空間,默認跟隨數據分區。-- 測試表:12 個月分區,1200 萬行均勻分布
CREATE TABLE t1 (...) PARTITION BY RANGE(l_shipdate) (STARTING '2008-01-01' ENDING '2008-12-31' EVERY 1 MONTH);
INSERT ... 1200 萬行;
RUNSTATS;
| 指標 | 全局索引 IDX_NOPART | 分區索引 IDX_PART | 改善 |
|---|---|---|---|
| B+ 樹層數 | 3 | 3(各分區) | — |
| 葉子頁總數 | 16,831 | 13,325(12 分區合計) | 20% ↓ |
| COUNT(*) 估計總成本 | 24,109.7 | 22,059.4 | 8.5% ↓ |
| 估計 I/O | 17,002 | 14,178 | 16% ↓ |
| 實測耗時 | 2.45 秒 | 2.19 秒 | 10% ↓ |
分區索引因樹更小、分區裁剪,空間與掃描雙贏。
同樣 120 萬行月度分區,對比 DETACH → LOAD → ATTACH → SET INTEGRITY:
| 階段 | 全局索引 | 分區索引 | 倍數 |
|---|---|---|---|
| DETACH | 0.34 秒 | 0.375 秒 | ≈1× |
| ATTACH | 0.7 秒 | 0.828 秒 | ≈1× |
| SET INTEGRITY | 18.45 秒 | 1.97 秒 | 9.4× 快 |
| 日誌增量 | 203 MB | 3.7 KB | 55,000× 少 |
原理:分區索引無需異步維護,ATTACH 只需為新分區建局部索引;SET INTEGRITY 僅驗證新分區約束,跳過全局索引重建。
PARTITIONED,系統自動判斷。SQL20303N,改用全局唯一索引。INDEX IN 將熱分區索引放高速存儲,冷分區放廉價存儲。syscat.indexpartitions 定期檢查 NLEAF、NLEVELS,發現傾斜及時 REORG INDEXES。分區索引是 DB2 9.7 分區表的「標配引擎」:空間更省、掃描更快、輪插極速、日誌極小、管理零負擔。升級 9.7 後,請檢查現有分區表索引類型,將符合條件的全局索引遷移為分區索引,立享紅利。