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

DB2 9.7 分區表全文本搜尋:Net Search Extender 新世代同步架構深度解析

     編輯:DB2 教學

背景:分區表優勢與 NSE 基礎

DB2 V9 引入表分區,ALTER TABLE ... ATTACH/DETACH PARTITION 實現零資料移動的滾入/滾出,大幅提升大型資料庫管理效能。NSE (Net Search Extender) 透過文本索引實現高效全文搜尋,索引由文檔重要詞項組成,建立後需更新(初始更新)方可使用。

同步機制演進:從觸發器到完整性處理

V9.7 前:觸發器基礎增量更新

  • IUD 觸發器自動將變更主鍵寫入日誌表
  • 更新索引時讀取日誌表主鍵套用至索引
  • 缺陷:LOAD、ATTACH/DETACH PARTITION 等非 IUD 操作不被捕獲,導致索引與源表不一致

V9.7 新架構:輔助日誌基礎設施

  • 主日誌表:觸發器捕獲 UPDATE 操作主鍵
  • 文本保留登台表 (Text-maintained Staging Table):輔助日誌表,捕獲 INSERT/DELETE 主鍵
  • 兩表結合實現完整性處理增量更新,涵蓋所有資料變更路徑

觸發器與完整性處理增量更新流程

實戰操作全紀錄

環境準備

db2start
db2text start
db2 CREATE DB MYDB
db2 CONNECT TO MYDB
export DB2DBDFT=mydb
db2text enable database for text

啟用資料庫自動建立 DB2EXT、SYSIBMTS 綱下目錄表。

建立分區表與文本索引

CREATE TABLE part.multipart (
  pk INTEGER NOT NULL PRIMARY KEY,
  year INTEGER NOT NULL,
  value INTEGER NOT NULL,
  comment VARCHAR(128)
) PARTITION BY RANGE (year) (STARTING 2000 ENDING 2004 EVERY 1);

INSERT INTO part.multipart VALUES
(1,2001,1,'blue and grey'), (2,2001,1,'yellow or red'),
(3,2002,1,'red checkered with blue'), (4,2002,1,'white and black'),
(5,2003,1,'grey or green');

-- 分區表建文本索引必須指定 administration tables in
db2text "create index part.multiind for text on part.multipart(comment) administration tables in USERSPACE1"

預設使用 index configuration(auxlog ON) 啟用輔助日誌。非分區表預設 auxlog OFF。分區表設 OFF 雖允許但不建議(失去完整性同步)。

建立索引後新增目錄表(以索引 ID 322707 為例):

  • DB2EXT.TLOGIX322707:主日誌表(記錄 UPDATE)
  • DB2EXT.TEVENTIX322707:事件表(更新資訊/問題)
  • SYSIBMTS.SYSTSAUXLOG_IX322707:輔助登台表(記錄 INSERT/DELETE)
  • SYSIBMTS.SYSTSMQT_IX322707:特殊 MQT,完整性架構一部分

初始更新與搜尋

db2text "update index part.multiind for text"
db2 "select * from part.multipart where contains(comment, '\"blue\"')=1"
-- 回傳 pk 1, 3

IUD 操作同步驗證

-- 新增 3 筆、刪除 pk=3、更新 pk=5
INSERT INTO part.multipart VALUES (6,2001,1,'new blue and grey'), (7,2001,1,'new yellow or red'), (8,2002,1,'new red checkered with blue');
DELETE FROM part.multipart WHERE pk=3;
UPDATE part.multipart SET comment='update grey or green' WHERE pk=5;

-- 更新索引前搜尋:刪除項消失,新增/更新項未被索引捕獲
-- 查詢日誌表:
SELECT * FROM DB2EXT.TLOGIX322707;           -- 1 筆:pk=5 (UPDATE)
SELECT * FROM SYSIBMTS.SYSTSAUXLOG_IX322707; -- 4 筆:pk=6,7,8 (INSERT), pk=3 (DELETE, OPERATIONTYPE=-1)

-- 更新索引後:
db2text "update index part.multiind for text"
-- 搜尋 blue/new/update 均正確回傳
-- 日誌表資料已清空

驗證:UPDATE 進主日誌,INSERT/DELETE 進輔助日誌,更新索引後同步完美、日誌自動清空。

新增分區並 LOAD 載入資料

-- 準備 data.del (year=2005 7 筆資料)
ALTER TABLE part.multipart ADD PARTITION STARTING 2005 ENDING 2005;
LOAD FROM data.del OF DEL INSERT INTO part.multipart;
-- 7 筆載入成功,但查詢報 SQL0668N reason code 1(表處於 Set Integrity Pending 狀態)

此時需執行 SET INTEGRITY FOR part.multipart IMMEDIATE CHECKED 完成完整性檢查,文本索引同步機制將自動捕獲 LOAD 載入的新分區資料(透過輔助日誌),後續更新索引即可搜尋。

關鍵技術總結

特性傳統觸發器模式V9.7 完整性處理模式
捕獲範圍僅 IUDIUD + LOAD + ATTACH/DETACH PARTITION
日誌結構單一主日誌表主日誌表 + 輔助登台表
分區表預設不支援auxlog ON(強制啟用)
非分區表預設auxlog OFFauxlog OFF(可選啟用)
索引一致性易因非 IUD 操作失效全路徑捕獲,強一致性

最佳實踐建議

  • 分區表全文索引必須使用 administration tables in 子句並保持 auxlog ON
  • 定期監控 DB2EXT.TEVENTIX* 事件表偵測同步異常
  • LOAD/ATTACH PARTITION 後執行 SET INTEGRITY ... IMMEDIATE CHECKED 觸發輔助日誌捕獲
  • 大量資料初始載入建議:先建表載入資料,再建文本索引並初始更新,避免大量增量同步開銷
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved