本地分區索引 (Local Partitioned Index) 是分區表性能與可維護性的基石。DB2 9.7 將其確立為默認索引類型,並引入豐富的表空間綁定選項。本文系統梳理創建語法、系統目錄映射關係、表空間綁定規則、ATTACH/DETACH PARTITION 零停機運維,構建完整知識體系。
ROLL IN/OUT 需 SET INTEGRITY 全表掃描。-- 1. 創建四季度範圍分區表,每分區獨立表空間
CREATE TABLE t1 (
l_orderkey INTEGER, l_partkey INTEGER, l_suppkey INTEGER,
l_shipdate DATE, padding1 CHAR(30)
) PARTITION BY RANGE (l_shipdate)
(PARTITION quarter01 STARTING '2008-01-01' ENDING '2008-03-31' IN DMS_D1,
PARTITION quarter02 STARTING '2008-04-01' ENDING '2008-06-30' IN DMS_D2,
PARTITION quarter03 STARTING '2008-07-01' ENDING '2008-09-30' IN DMS_D3,
PARTITION quarter04 STARTING '2008-10-01' ENDING '2008-12-31' IN DMS_D4);
-- 2. 創建非分區索引 (全局)
CREATE INDEX idx_t1_l_orderkey ON t1(l_orderkey) NOT PARTITIONED;
-- 3. 創建本地分區索引 (默認綁定數據分區表空間)
CREATE INDEX idx_t1_l_partkey ON t1(l_partkey) PARTITIONED;
SELECT substr(TABNAME,1,10) t_name, substr(DATAPARTITIONNAME,1,10) part_name,
DATAPARTITIONID, TBSPACEID, substr(LOWVALUE,1,12) low_value, substr(HIGHVALUE,1,12) high_value
FROM syscat.datapartitions WHERE tabname='T1';
-- 結果:
-- T1 QUARTER01 0 8 '2008-01-01' '2008-03-31' (DMS_D1, TBSPACEID=8)
-- T1 QUARTER02 1 9 '2008-04-01' '2008-06-30' (DMS_D2, TBSPACEID=9)
-- T1 QUARTER03 2 10 ... (DMS_D3, TBSPACEID=10)
-- T1 QUARTER04 3 11 ... (DMS_D4, TBSPACEID=11)
SELECT substr(tabname,1,10) tab_name, substr(INDNAME,1,18) inx_name, TBSPACEID
FROM syscat.indexes WHERE tabname='T1';
-- 結果:
-- T1 IDX_T1_L_ORDERKEY 8 -- 非分區索引落在第一個數據分區表空間 DMS_D1 (ID=8)
-- T1 IDX_T1_L_PARTKEY 65530 -- 分區索引特殊標識 65530 (不佔用實際表空間ID)
關鍵洞察:TBSPACEID=65530 是DB2內部標識「分區索引分佈在多個表空間」,不對應實際表空間對象。
SELECT substr(INDNAME,1,18) idx_name, DATAPARTITIONID
FROM syscat.indexpartitions;
-- 結果:
-- IDX_T1_L_PARTKEY 0 -- 對應 quarter01,存儲於 DMS_D1
-- IDX_T1_L_PARTKEY 1 -- 對應 quarter02,存儲於 DMS_D2
-- IDX_T1_L_PARTKEY 2 -- 對應 quarter03,存儲於 DMS_D3
-- IDX_T1_L_PARTKEY 3 -- 對應 quarter04,存儲於 DMS_D4
驗證結論:分區索引分區自動綁定同名數據分區的表空間,實現存儲局部性與I/O隔離。
CREATE TABLE t1 (columns) IN ts1 INDEX IN ts2
PARTITION BY RANGE (col)
(PARTITION p0 STARTING ... ENDING ... IN ts3, -- 數據 ts3, 索引默認 ts3
PARTITION p1 STARTING ... ENDING ... INDEX IN ts5, -- 數據 ts3(繼承), 索引 ts5
PARTITION p2 STARTING ... ENDING ... INDEX IN ts4,
PARTITION p3 STARTING ... ENDING ... INDEX IN ts4,
PARTITION p4 STARTING ... ENDING ...); -- 數據 ts1(表默認), 索引 ts1(繼承表默認)
CREATE INDEX x1 ON t1(...) NOT PARTITIONED; -- 存 ts2 (表級 INDEX IN)
CREATE INDEX x2 ON t1(...) PARTITIONED; -- 分區索引按上述規則分佈
CREATE INDEX x3 ON t1(...) PARTITIONED; -- 同上
規則總結:分區索引表空間優先級 — 分區級 INDEX IN > 表級 INDEX IN > 數據分區表空間 > 表默認表空間。
場景:每月滾動保留12個月數據,DETACH 最舊月,ATTACH 新月。
-- 1. 分離分區為獨立表
ALTER TABLE t1 DETACH PARTITION quarter01 INTO dtached_q1;
-- 2. 異步處理 dtached_q1 (歸檔導出 / 直接 DROP)
-- 無需 SET INTEGRITY,主表即時可用,無鎖升級
-- 3. 可選: 歸檔數據
EXPORT TO /archive/q1.ixf OF IXF SELECT * FROM dtached_q1;
DROP TABLE dtached_q1;
-- 1. 預先創建裝載表 (結構完全一致,含索引/約束)
CREATE TABLE new_q5 (LIKE t1 INCLUDING INDEXES INCLUDING CONSTRAINTS) IN DMS_D5;
-- 2. 批量載入數據 (LOAD/INGEST, 無業務影響)
LOAD FROM /data/q5.ixf OF IXF REPLACE INTO new_q5;
RUNSTATS ON TABLE new_q5 AND INDEXES ALL;
-- 3. 秒級掛接 (元數據操作,無數據移動)
ALTER TABLE t1 ATTACH PARTITION quarter05
STARTING '2009-01-01' ENDING '2009-03-31' IN DMS_D5
FROM TABLE new_q5;
-- 4. 異步完成索引構建/統計 (可選 SET INTEGRITY IMMEDIATE CHECKED)
-- 業務全程可讀寫,新分區數據漸進可見
CREATE INDEX ... ON partitioned_table 無 NOT PARTITIONED 關鍵字時,**默認創建分區索引**。SQL20303N。本地分區索引通過存儲局部性、維護隔離性、輪換零停機三大特性,成為分區表的標準配置。掌握 syscat.indexpartitions 映射關係、INDEX IN 表空間綁定規則、ATTACH/DETACH 元數據級操作,是DB2大數據倉庫DBA的核心硬技能。