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

MOVE LOB 是否會導致其他索引失效?實測證明:不會

     編輯:MySQL 綜合教學

MOVE LOB 是否會導致其他索引失效?實測證明:不會

客戶升級腳本執行 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 時間未變

結論

  1. MOVE LOB 不會導致非 LOB 索引失效(狀態保持 VALID,無需 REBUILD)。
  2. 客戶遇到的「索引失效」極大概率由同期其他操作導致(如 ALTER TABLE ... MOVE 整表移動、DROP PARTITION、統計信息失效、未提交事務鎖定等)。
  3. 排查建議:檢查 DBA_INDEXES.STATUS 是否為 UNUSABLE,查看 DBA_SEGMENTS 確認段是否存在,核對變更日誌定位真因。

夜深思考:索引存儲的是列值 + ROWID,MOVE LOB 僅改變 LOB 段物理位置,不修改表塊地址,故 ROWID 不變,普通索引自然無需維護。知其然更要知其所以然。

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