首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

DB2 9.7 分區索引深度解析:原理、實測與運維紅利

     編輯:DB2 教學

背景:從全局索引到分區索引的跨越

DB2 9.7 前,範圍分區表僅支持非分區(全局)索引,所有分區共享一棵 B+ 樹,導致:

  • 索引掃描單線程、單表空間,I/O 熱點明顯。
  • DETACH/ATTACH PARTITION 需 SET INTEGRITY 重建全局索引,耗時、佔日誌、長鎖表。

9.7 引入 分區索引:每個數據分區對應一個獨立索引分區,各自維護 B+ 樹,葉子 RID 僅指向本分區行。創建索引默認即為分區索引,除非:

  1. 指定 UNIQUE 且索引鍵未包含所有分區鍵列。
  2. 空間/ XML 索引。

分區索引創建與元數據驗證

示例:四分區銷售表

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 子句在分區級指定索引表空間,默認跟隨數據分區。

空間佔用與掃描性能實測(1200 萬行)

-- 測試表: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+ 樹層數33(各分區)—
葉子頁總數16,83113,325(12 分區合計)20% ↓
COUNT(*) 估計總成本24,109.722,059.48.5% ↓
估計 I/O17,00214,17816% ↓
實測耗時2.45 秒2.19 秒10% ↓

分區索引因樹更小、分區裁剪,空間與掃描雙贏。

分區輪換(Roll-in/Roll-out)核心紅利

同樣 120 萬行月度分區,對比 DETACH → LOAD → ATTACH → SET INTEGRITY:

階段全局索引分區索引倍數
DETACH0.34 秒0.375 秒≈1×
ATTACH0.7 秒0.828 秒≈1×
SET INTEGRITY18.45 秒1.97 秒9.4× 快
日誌增量203 MB3.7 KB55,000× 少

原理:分區索引無需異步維護,ATTACH 只需為新分區建局部索引;SET INTEGRITY 僅驗證新分區約束,跳過全局索引重建。

運維最佳實踐

  1. 默認即最佳:9.7+ 創建索引無需顯式 PARTITIONED,系統自動判斷。
  2. 唯一索引規則:必須包含所有分區鍵列,否則報 SQL20303N,改用全局唯一索引。
  3. 表空間規劃:利用 INDEX IN 將熱分區索引放高速存儲,冷分區放廉價存儲。
  4. 監控視圖:syscat.indexpartitions 定期檢查 NLEAF、NLEVELS,發現傾斜及時 REORG INDEXES。

結語

分區索引是 DB2 9.7 分區表的「標配引擎」:空間更省、掃描更快、輪插極速、日誌極小、管理零負擔。升級 9.7 後,請檢查現有分區表索引類型,將符合條件的全局索引遷移為分區索引,立享紅利。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved