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

PL/SQL Developer 導出分區索引腳本缺陷分析與規避方案

     編輯:Oracle 資料庫基礎

案例背景

  • 環境:IBM x3650 / Win2003 SP2 / Oracle 9.2.0.1 / PL/SQL Developer 7.0.2.1076
  • 需求:Drop 並重建分區表 T_SMS (按天分區,每日 Truncate 保留 30 天),要求索引為本地分區索引 (Local Partitioned Index)。
  • 現象:用 PL/SQL Developer「View SQL」導出建索引腳本重建後,索引變為全域索引 (Global Index),導致 Truncate Partition 後索引失效 (UNUSABLE),Insert 失敗。

驗證實驗

三種導出方式對比

  • Oracle Export (exp):導出再導入,**索引類型完整保留** (本地仍為本地)。
  • SQL Insert / PL/SQL Developer 內建導出:均**將本地索引錯誤轉為全域索引**。

規避方案

  1. 首選:使用原生 exp/imp。可用 exp ... QUERY="WHERE 1=0" 導出空表結構,再 imp 至目標庫,獲得正確 DDL。
  2. 手工修正腳本:參考下方正確本地索引 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。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
建索引語法PL/SQL Dev 導出結果結論
CREATE INDEX ... LOCAL TABLESPACE ...CREATE INDEX ... (無 LOCAL,無分區子句)本地索引 → 全域索引,類型遺失
CREATE INDEX ... [GLOBAL] TABLESPACE ...同左,並自動補全 PCTFREE/STORAGE 等儲存子句全域索引導出正確,但多出儲存選項