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

DB2 9.7 本地分區索引創建全解析:存儲映射、表空間綁定與ROLL IN/OUT實戰

     編輯:DB2 教學

DB2 9.7 本地分區索引深度解析:從創建語法到存儲映射、分區輪換零停機實戰

本地分區索引 (Local Partitioned Index) 是分區表性能與可維護性的基石。DB2 9.7 將其確立為默認索引類型,並引入豐富的表空間綁定選項。本文系統梳理創建語法、系統目錄映射關係、表空間綁定規則、ATTACH/DETACH PARTITION 零停機運維,構建完整知識體系。

核心概念:本地 vs 全局

  • 本地分區索引 (PARTITIONED):每個索引分區僅引用對應數據分區的行,RID指向單一數據分區,索引分區與數據分區一對一、同名、同表空間 (默認)。
  • 全局非分區索引 (NOT PARTITIONED):單一B樹覆蓋全表,跨分區引用,維護開銷大,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;

系統目錄映射驗證:看懂存儲拓撲

1. 數據分區信息

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)

2. 索引基本信息 (syscat.indexes)

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內部標識「分區索引分佈在多個表空間」,不對應實際表空間對象。

3. 索引分區詳細映射 (syscat.indexpartitions)

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隔離。

進階:自定義索引分區表空間 (INDEX IN 子句)

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 > 數據分區表空間 > 表默認表空間。

零停機分區輪換:ATTACH / DETACH PARTITION 實戰

場景:每月滾動保留12個月數據,DETACH 最舊月,ATTACH 新月。

DETACH 最舊分區 (歸檔/刪除)

-- 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;

ATTACH 新分區 (數據預載入後秒級上線)

-- 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)
--    業務全程可讀寫,新分區數據漸進可見

DB2 9.7+ 默認行為變更:分區索引成標配

  • CREATE INDEX ... ON partitioned_table 無 NOT PARTITIONED 關鍵字時,**默認創建分區索引**。
  • 非唯一分區索引:DB2自動在索引鍵後追加分區鍵列確保唯一性。
  • 唯一分區索引:索引列必須包含所有分區鍵列,否則報 SQL20303N。

本地分區索引通過存儲局部性、維護隔離性、輪換零停機三大特性,成為分區表的標準配置。掌握 syscat.indexpartitions 映射關係、INDEX IN 表空間綁定規則、ATTACH/DETACH 元數據級操作,是DB2大數據倉庫DBA的核心硬技能。

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