某業務系統 BILL 表擁有 129 個欄位、24 萬筆資料。雖資料量不大,但寬表導致 I/O 競爭頻繁、查詢效能低落。決定採用範圍分區表優化,以 UP_TIME (單據時間) 為分區鍵,每年一個分區。
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| 1. CTAS 重建 + RENAME | 語法簡單、無 UNDO、少 REDO、速度快 | 一致性難保證、RENAME 間隙業務失敗、不適合大表 | 修改少、閒時操作、中小表 |
| 2. 交換分區 | 僅修改字典、零資料搬移、效能最高 | 一致性問題、切換瞬間查詢報錯、多分區需 SPLIT 增加複雜度 | 大表轉單分區、閒時操作 |
| 3. 線上重定義 (採用) | 全程 DML 可用、僅切換瞬間鎖表、高可用性、支援約束/索引同步建立 | 實作步驟較繁瑣 | 生產環境、大表、需零停機 |
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)
);
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;
/
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;
BEGIN
DBMS_REDEFINITION.SYNC_INTERIM_TABLE('DEMO_USER','BILL','BILL_TEST');
END;
/
BEGIN
DBMS_REDEFINITION.FINISH_REDEF_TABLE('DEMO_USER','BILL','BILL_TEST');
END;
/
DROP TABLE BILL_TEST;
分區裁剪生效,查詢僅掃描相關年份分區,I/O 大幅下降,資源競爭消失,業務查詢回應時間從秒級降至毫秒級。