首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 表與索引分離存儲:不同表空間配置、遷移腳本與主鍵約束指定索引表空間

     編輯:Oracle 資料庫相關知識

隨著數據量增長,表與索引共置同一表空間導致 IO 爭用。本文說明分離收益、遷移命令、批量生成腳本、新建表時約束指定索引表空間完整方案。

為什麼要分離?

收益說明
IO 隔離表順序讀、索引隨機讀,分盤並行不干擾
故障域隔離索引表空間損壞僅需 REBUILD,數據不丟失
備份策略分離索引可 NOLOGGING/不備份,縮短備份窗口
維護彈性獨立 REBUILD/COALESCE/移動,不影響表可用性

單索引遷移命令

ALTER INDEX index_owner.index_name REBUILD TABLESPACE new_index_tbs;

批量生成遷移腳本 (Schema 級)

SELECT 'ALTER INDEX ' || owner || '.' || index_name || ' REBUILD TABLESPACE index_tbs;'
FROM dba_indexes
WHERE table_owner = 'SCHEMA_NAME'
ORDER BY index_name;

輸出結果直接複製執行,或 SPOOL 到文件 @rebuild_indexes.sql。

新建表時:主鍵/唯一約束指定索引表空間

CREATE TABLE tmp (
  mon VARCHAR2(6),
  idno VARCHAR2(10),
  CONSTRAINT pk_name PRIMARY KEY (mon, idno)
    USING INDEX TABLESPACE index_tbs,
  CONSTRAINT uk_name UNIQUE (mon)
    USING INDEX TABLESPACE index_tbs
);

關鍵語法:USING INDEX TABLESPACE <tablespace_name> 子句,適用於 PK/UK 約束創建時隱式建立的索引。

驗證分離效果

SELECT table_name, tablespace_name AS table_tbs
FROM dba_tables WHERE owner = 'SCHEMA_NAME';

SELECT index_name, tablespace_name AS index_tbs
FROM dba_indexes WHERE table_owner = 'SCHEMA_NAME';

注意事項

  • 分離前評估:小數據量 (<100MB) 收益不明顯,維護成本可能大於收益
  • 索引表空間建議:EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M 減少碎片
  • 分區表:GLOBAL INDEX 同理可指定表空間;LOCAL INDEX 隨分區走
  • RAC 環境:確保目標表空間在所有節點掛載路徑一致
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved