客戶升級腳本執行 ALTER TABLE ... MOVE LOB(...) 後反饋「非 LOB 字段索引失效」。經驗告訴我:MOVE LOB 僅重組 LOB 段,不應觸及其他索引。為求證,設計實驗驗證。
-- 建表:主鍵 + LOB + 普通列 + 普通索引
CREATE TABLE dxmy_lob (
id NUMBER PRIMARY KEY,
name BLOB,
sex VARCHAR2(10),
location VARCHAR2(100)
);
INSERT INTO dxmy_lob VALUES (2, TO_BLOB('110111011'), 'MAN', 'SOMEWARE');
COMMIT;
-- 建立普通索引
CREATE INDEX ind_dxmy ON dxmy_lob(sex);
-- MOVE LOB 前檢查索引狀態
SELECT owner, index_name, index_type, status, last_analyzed
FROM dba_indexes WHERE table_name='DXMY_LOB';
-- 結果:IND_DXMY (NORMAL, VALID), SYS_C0011400 (PK, VALID), SYS_IL... (LOB, VALID)
-- 執行 MOVE LOB
ALTER TABLE dxmy_lob MOVE LOB(name) STORE AS LOB_SEG (TABLESPACE users);
-- MOVE LOB 後再次檢查
SELECT owner, index_name, index_type, status, last_analyzed
FROM dba_indexes WHERE table_name='DXMY_LOB';
-- 結果:所有索引仍為 VALID,LAST_ANALYZED 時間未變
ALTER TABLE ... MOVE 整表移動、DROP PARTITION、統計信息失效、未提交事務鎖定等)。DBA_INDEXES.STATUS 是否為 UNUSABLE,查看 DBA_SEGMENTS 確認段是否存在,核對變更日誌定位真因。夜深思考:索引存儲的是列值 + ROWID,MOVE LOB 僅改變 LOB 段物理位置,不修改表塊地址,故 ROWID 不變,普通索引自然無需維護。知其然更要知其所以然。