DB2 9 引入表分區(Range Partitioning),數據按列值範圍分散至多個數據分區,便於 ATTACH/DETACH PARTITION 秒級轉入轉出。但索引仍為非分區(全局索引),鍵值指向所有分區,導致:
ATTACH 後需為新分區建索引,DETACH 前需清理鍵值,耗時長、影響可用性DB2 9.7 引入 Partitioned Index(本地索引),每個索引分區僅針對對應數據分區建立鍵值。系統/用戶索引均可分區。非分區索引更名為 Global Index。
CREATE TABLE datapartT (a INT, b INT)
IN TbspT INDEX IN TbspX
PARTITION BY (a, b)
( PARTITION Part0 STARTING (0,0) ENDING (0,10) IN TbspD,
PARTITION Part1 ENDING (20,20) INDEX IN TbspY,
PARTITION Part2 ENDING (40,40) INDEX IN TbspW,
PARTITION Part3 STARTING (100,100) ENDING (150,150) INDEX IN TbspW,
PARTITION Part4 ENDING (200,200) );
INDEX IN TbspX:非分區索引默認存放處INDEX IN TbspY:該分區的所有分區索引分區存放處CREATE INDEX purpleidx ON datapartT(a,b) PARTITIONED;
CREATE INDEX greenidx ON datapartT(b) PARTITIONED;
CREATE INDEX blueidx ON datapartT(a) NOT PARTITIONED; -- 全局索引
IN tablespace,存放位置由表定義決定db2 describe indexes for table datapartt
-- Index partitioning 列:P=分區索引, N=非分區索引
SYSCAT.INDEXES:分區索引顯示邏輯 ID(TBSPACEID=32768, INDEX_OBJECTID=65530)SYSCAT.DATAPARTITIONS:每個數據分區的物理 OBJECTID/TBSPACEIDSYSCAT.INDEXPARTITIONS(V9.7 新增):每個索引分區的物理 INDPARTITIONOBJECTID/INDPARTITIONTBSPACEID,同一數據分區下的所有分區索引分區共享一個物理索引對象DROP 舊索引RENAME INDEX new_name TO old_name 恢復原名ATTACH:需掃描新數據為所有全局索引建鍵值DETACH:需從所有全局索引刪除舊鍵值ATTACH:源表索引直接成為目標表新索引分區,無數據移動、無索引重建,僅需 SET INTEGRITY 驗證DETACH:索引分區直接轉為新表索引分區索引將索引結構與數據分區對齊,徹底消除大表分區操作時的索引維護瓶頸,為數據倉庫、BI 系統帶來數量級性能提升。升級至 V9.7 後,建議對核心大表逐步遷移至分區索引架構。