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

Oracle 10g 大表查詢優化實戰:線上重定義轉換分區表

     編輯:Oracle 資料庫基礎

案例背景

某業務系統 BILL 表擁有 129 個欄位、24 萬筆資料。雖資料量不大,但寬表導致 I/O 競爭頻繁、查詢效能低落。決定採用範圍分區表優化,以 UP_TIME (單據時間) 為分區鍵,每年一個分區。

三種轉換方案對比

方案優點缺點適用場景
1. CTAS 重建 + RENAME語法簡單、無 UNDO、少 REDO、速度快一致性難保證、RENAME 間隙業務失敗、不適合大表修改少、閒時操作、中小表
2. 交換分區僅修改字典、零資料搬移、效能最高一致性問題、切換瞬間查詢報錯、多分區需 SPLIT 增加複雜度大表轉單分區、閒時操作
3. 線上重定義 (採用)全程 DML 可用、僅切換瞬間鎖表、高可用性、支援約束/索引同步建立實作步驟較繁瑣生產環境、大表、需零停機

線上重定義實作步驟 (DBMS_REDEFINITION)

1. 建立中間分區表

CREATE TABLE BILL_TEST (
  BILL_ID CHAR(8) NOT NULL,
  UP_TIME DATE NOT NULL,
  ... -- 其餘 127 欄位略
  JH_CTIME DATE DEFAULT SYSDATE
)
TABLESPACE DEMO_USER
PARTITION BY RANGE (UP_TIME) (
  PARTITION P1 VALUES LESS THAN (TO_DATE('2002-01-01','YYYY-MM-DD')),
  PARTITION P2 VALUES LESS THAN (TO_DATE('2003-01-01','YYYY-MM-DD')),
  PARTITION P3 VALUES LESS THAN (TO_DATE('2004-01-01','YYYY-MM-DD')),
  PARTITION P4 VALUES LESS THAN (TO_DATE('2005-01-01','YYYY-MM-DD')),
  PARTITION P5 VALUES LESS THAN (TO_DATE('2006-01-01','YYYY-MM-DD')),
  PARTITION P6 VALUES LESS THAN (TO_DATE('2007-01-01','YYYY-MM-DD')),
  PARTITION P7 VALUES LESS THAN (TO_DATE('2008-01-01','YYYY-MM-DD')),
  PARTITION P8 VALUES LESS THAN (MAXVALUE)
);

2. 可行性檢查與啟動重定義

BEGIN
  DBMS_REDEFINITION.CAN_REDEF_TABLE('DEMO_USER','BILL', DBMS_REDEFINITION.CONS_USE_PK);
  DBMS_REDEFINITION.START_REDEF_TABLE('DEMO_USER','BILL','BILL_TEST', NULL, DBMS_REDEFINITION.CONS_USE_PK);
END;
/

3. 同步建立索引、約束 (於中間表)

ALTER TABLE BILL_TEST ADD CONSTRAINT TEST_BILL_UK UNIQUE (PLAN_CHECK) USING INDEX TABLESPACE DEMO_USER;
CREATE INDEX TEST_SY_BILL_BASE_ID ON BILL_TEST (BASE_ID) TABLESPACE DEMO_USER;
CREATE INDEX TEST_SY_BILL_HETONG_ID ON BILL_TEST (HETONG_ID) TABLESPACE DEMO_USER;
CREATE INDEX TEST_SY_BILL_MAX_TYPE ON BILL_TEST (MAX_TYPE) TABLESPACE DEMO_USER;
CREATE INDEX TEST_SY_BILL_STEP ON BILL_TEST (BILL_STEP) TABLESPACE DEMO_USER;
CREATE INDEX TEST_SY_BILL_UP_TIME ON BILL_TEST (UP_TIME) TABLESPACE DEMO_USER;

4. 同步增量資料

BEGIN
  DBMS_REDEFINITION.SYNC_INTERIM_TABLE('DEMO_USER','BILL','BILL_TEST');
END;
/

5. 完成切換

BEGIN
  DBMS_REDEFINITION.FINISH_REDEF_TABLE('DEMO_USER','BILL','BILL_TEST');
END;
/

6. 清理中間表

DROP TABLE BILL_TEST;

優化效果

分區裁剪生效,查詢僅掃描相關年份分區,I/O 大幅下降,資源競爭消失,業務查詢回應時間從秒級降至毫秒級。

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