DB2 V9.7 大幅擴展 pureXML 功能,正式支援分區表儲存 XML 資料,並相容 MDC 表、宣告式暫存表、使用者自訂函數及分區資料庫環境 (DPF)。本文詳細說明建立/管理含 XML 欄位的分區表、資料與索引物件儲存策略、XML 資料高效轉入轉出 (Roll-in/Roll-out)、查詢效能提升 (分區剪除) 等關鍵技術,並附完整實作範例。
CREATE TABLE 可直接定義 XML 欄位;ALTER TABLE ADD COLUMN 可為現有分區表新增 XML 欄位ALTER TABLE ADD/ATTACH/DETACH PARTITION 完整支援含 XML 資料的分區操作REORG-- 建立資料庫
db2 CREATE DB MYDB
-- 建立多個表空間 (自動擴展)
CREATE TABLESPACE TbspXT MANAGED BY DATABASE USING (FILE 'tspXT' 4 M) AUTORESIZE YES;
CREATE TABLESPACE TbspXD MANAGED BY DATABASE USING (FILE 'tspXD' 4 M) AUTORESIZE YES;
CREATE TABLESPACE TbspXW MANAGED BY DATABASE USING (FILE 'tspXW' 4 M) AUTORESIZE YES;
CREATE TABLESPACE IXTbspXX MANAGED BY DATABASE USING (FILE 'ixtspXX' 4 M) AUTORESIZE YES;
CREATE TABLESPACE IXTbspXY MANAGED BY DATABASE USING (FILE 'ixtspXY' 4 M) AUTORESIZE YES;
CREATE TABLESPACE IXTbspXW MANAGED BY DATABASE USING (FILE 'ixtspXW' 4 M) AUTORESIZE YES;
查詢表空間 ID 以利後續驗證:
SELECT SUBSTR(TBSPACE,1,15) AS TBSPACE, TBSPACEID
FROM SYSCAT.TABLESPACES WHERE TBSPACE LIKE '%TBSPX%' ORDER BY TBSPACEID;
CREATE TABLE XMLPARTT (c1 INT, doc XML)
IN TbspXT INDEX IN IXTbspXX
PARTITION BY (c1)
( STARTING 0 ENDING 10 IN TbspXD,
STARTING 11 ENDING 20 INDEX IN IXTbspXY,
STARTING 21 ENDING 30 IN TbspXW INDEX IN IXTbspXW,
STARTING 31 ENDING 40 INDEX IN IXTbspXW,
STARTING 41 ENDING 50 );
關鍵點:
IN / INDEX IN 子句控制各分區資料與索引物件位置-- 插入測試資料 (20 筆)
INSERT INTO XMLPARTT VALUES (1, 'hoho intern ');
-- ... 略
-- 建立兩個 XML 索引,指定/不指定表空間
CREATE INDEX idxxml1 ON XMLPARTT(doc) GENERATE KEY USING XMLPATTERN '//name' AS SQL VARCHAR(50) IN IXTbspXW;
CREATE INDEX idxxml2 ON XMLPARTT(doc) GENERATE KEY USING XMLPATTERN '//role' AS SQL VARCHAR(50);
✅ 可對單一 XML 索引獨立執行 REORG INDEX idxXML1。
SELECT SUBSTR(TABNAME,1,10) TABNAME, TABLEID, TBSPACEID FROM SYSCAT.TABLES WHERE TABNAME='XMLPARTT';
-- TABNAME TABLEID TBSPACEID
-- XMLPARTT -32768 -6 (分區表特有邏輯 ID)
SELECT SUBSTR(TABNAME,1,10) TABNAME, SUBSTR(INDNAME,1,20) INDNAME, INDEXTYPE, TBSPACEID, INDEX_OBJECTID
FROM SYSCAT.INDEXES WHERE TABNAME='XMLPARTT';
-- 索引類型說明:
-- XRGN: XML 區域索引 (分區索引)
-- XVIL: XML 邏輯索引 (非分區)
-- XVIP: XML 物理索引 (非分區)
-- XPTH: XML 路徑索引 (非分區)
驗證結果顯示:
IDXXML1 (邏輯/物理) 置於表空間 ID 8 (IXTBSPXW),符合建立時 IN IXTbspXWIDXXML2 置於表空間 ID 6 (IXTBSPXX),沿用表層級 INDEX INSELECT SUBSTR(DATAPARTITIONNAME,1,20) DATAPARTITIONNAME, PARTITIONOBJECTID, TBSPACEID, SUBSTR(TABNAME,1,10) TABNAME
FROM SYSCAT.DATAPARTITIONS WHERE TABNAME='XMLPARTT';
-- 5 個資料分區,各自 TBSPACEID 對應建表指定表空間
SELECT SUBSTR(TABNAME,1,10) TABNAME, SUBSTR(INDNAME,1,20) INDNAME, INDPARTITIONTBSPACEID, INDPARTITIONOBJECTID, DATAPARTITIONID
FROM SYSCAT.INDEXPARTITIONS WHERE TABNAME='XMLPARTT';
-- XML 區域索引 5 個索引分區,表空間分布由分區層級 INDEX IN 控制
-- 建立非分區 XML 表並插入資料 (分區範圍外)
CREATE TABLE temp (c1 INT, doc XML);
INSERT INTO temp VALUES (51, 'wawa mgr ');
-- ... 共 3 筆
-- 轉入
ALTER TABLE XMLPARTT ATTACH PARTITION STARTING 51 ENDING 60 FROM temp;
SET INTEGRITY FOR XMLPARTT IMMEDIATE CHECKED;
-- 驗證
SELECT COUNT(*) FROM XMLPARTT WHERE c1 > 50; -- 返回 3
操作會將表置於 Set Integrity Pending 狀態,需執行 SET INTEGRITY 完成索引/資料一致性維護。轉入後 SYSCAT.DATAPARTITIONS 新增一分區,SYSCAT.INDEXPARTITIONS 新增對應索引分區。
ALTER TABLE XMLPARTT DETACH PARTITION part5 INTO temp;
-- 驗證
SELECT COUNT(*) FROM XMLPARTT WHERE c1 > 50; -- 0
SELECT COUNT(*) FROM temp; -- 3
轉出瞬間完成,無需 SET INTEGRITY,原分區資料移至獨立表 temp。
REORG、BACKUP、ROLL-IN/OUT 不影響其他分區