| 建索引語法 | PL/SQL Dev 導出結果 | 結論 |
CREATE INDEX ... LOCAL TABLESPACE ... | CREATE INDEX ... (無 LOCAL,無分區子句) | 本地索引 → 全域索引,類型遺失 |
CREATE INDEX ... [GLOBAL] TABLESPACE ... | 同左,並自動補全 PCTFREE/STORAGE 等儲存子句 | 全域索引導出正確,但多出儲存選項 |
三種導出方式對比
- Oracle Export (exp):導出再導入,**索引類型完整保留** (本地仍為本地)。
- SQL Insert / PL/SQL Developer 內建導出:均**將本地索引錯誤轉為全域索引**。
規避方案
- 首選:使用原生 exp/imp。可用
exp ... QUERY="WHERE 1=0" 導出空表結構,再 imp 至目標庫,獲得正確 DDL。
- 手工修正腳本:參考下方正確本地索引 DDL 模板,補齊
LOCAL (PARTITION ...) 子句。
正確本地分區索引 DDL 模板 (9i)
CREATE INDEX T_SMS_IDMONTHDAY ON T_SMS (MONTHDAY)
TABLESPACE SMS_DAT
INITRANS 2 MAXTRANS 255
LOCAL (
PARTITION P01 TABLESPACE SMS_DAT PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE (INITIAL 64K MINEXTENTS 1 MAXEXTENTS 2147483645 BUFFER_POOL DEFAULT),
PARTITION P02 TABLESPACE SMS_DAT PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE (INITIAL 64K MINEXTENTS 1 MAXEXTENTS 2147483645 BUFFER_POOL DEFAULT),
... -- 其餘分區同樣定義
)
NOPARALLEL;
全域索引 DDL 對比
CREATE INDEX T_SMS_IDMONTHDAY ON T_SMS (MONTHDAY)
LOGGING TABLESPACE SMS_DAT PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE (INITIAL 64K MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 BUFFER_POOL DEFAULT)
NOPARALLEL;
核心差異
- 本地索引:**等分區數目** 的索引分區,每分區可獨立維護 (Truncate/Drop/Rebuild),Truncate Partition 後自動重建,不會 UNUSABLE。
- 全域索引:單一結構橫跨所有分區,Truncate Partition **必須手動 REBUILD** 全域索引或對應分區,否則標記 UNUSABLE 導致 DML 失敗。
建議
PL/SQL Developer 7.x 存在導出本地分區索引缺陷,生產環境**嚴禁直接使用其導出腳本重建分區表索引**;請改用 exp/imp、DBMS_METADATA.GET_DDL 或手工編寫 DDL。
- 上一篇文章: Oracle 並發控制核心機制:鎖類型、隔離級別與實戰觀察
- 下一篇文章: Oracle VM (Xen) 虛擬環境部署 Oracle Clusterware 11g RAC 完整實戰手冊
Copyright ©
程式碼之家 All Rights Reserved