首先看 SQL Reference 大致了解了 Oracle 的分區修改操作。Alter table 語句的alter_table_partitioning 子句可以分為以下幾類:
全局:modify_table_default_attrs
分區:Modify, Move, Add, Coalesce, Drop, Rename, Truncate, Split, Merge, Exchange
子分區:Set Template, Modify, Move, Drop, Rename, Truncate, Split, Merge, Exchange
Move: 將分區、子分區移動到新的表空間。
Coalesce: 只適用於 hash 分區的表。作用是減少一個 hash 分區;方法是將最后一個分區的數據分布到前面的分區中,再刪除此分區。
Merge: 將兩個分區、子分區合並為一個新分區,並刪除兩個舊分區。Merge 可以合並 List 和相鄰的 Range 分區,只能合並屬於同一分區的 List 子分區。
Exchange: 交換表分區。
我要做的是添加 List 分區、List 子分區、修改子分區模板。
1. 添加 List 分區:
如果表使用 List 分區,且創建了 Default 分區,則此表上無法執行 Add 分區操作,必須 Split 此表的 Default 分區。Alter table 語句提供了 split_table_partition 子句。此子句的功能是創建兩個新分區(新建 Segment,可以指定新的物理屬性),移動 partition 指定的分區的數據,滿足 values 條件的放入 into 的第一個分區,其余的放入第二個分區,之后原分區。Oracle 將自動 Split Local Index,因此需要重建索引。
下面的語句為表 A_CHECKBILL_MONTH 添加了一個分區 P_6230000,將原有 P_OTHERS 分區中 COMPANY_ID = 6230000 的數據存儲到新分區 P_6230000 ,剩余數據存儲到 P_OTHERS。
alter table A_CHECKBILL_MONTH split partition P_OTHERS values (6230000) into ( partition P_6230000, partition P_OTHERS ) update indexes;
2. 添加 List 子分區:
Oracle 沒有提供子分區 Add 操作,因此添加子分區必須使用 Split 操作。Alter table 語句提供了 split_table_subpartition 子句,此子句的功能是將一個 List 子分區 Split 為兩個。原理跟 List 分區類似。
下面的語句為表 A_BATCH_TURNDAYS 添加了一個子分區 P_6230000,將原有 P_OTHERS 分區中 COMPANY_ID = 6230000 的數據存儲到新分區 P_6230000 ,剩余數據存儲到 P_OTHERS。
alter table A_BATCH_TURNDAYS split subpartition P_200401_SP_OTHERS values (6230000) into ( subpartition P_200401_SP_6230000, subpartition P_200401_SP_OTHERS ) update indexes;
3. 修改子分區模板:
Alter table 語句的 set_subpartition_template 子句,作用是重新定義(或新建、清除)復合分區表的 list 或 hash 子分區模板。執行 set_subpartition_template 操作后,表中已創建的子分區不受影響,本地、全局索引也不受影響。在此之后的分區操作(例如 add、merge 操作)將使用新的模板。
以下語句更新表 A_CHECKBILL_DAY 的子分區模板
alter table A_CHECKBILL_DAY set subpartition template ( subpartition SP_2000000 values (2000000), subpartition SP_6280000 values (6280000), subpartition SP_6010000 values (6010000), subpartition SP_6020500 values (6020500), subpartition SP_6050000 values (6050000), subpartition SP_6070000 values (6070000), subpartition SP_6080400 values (6080400), subpartition SP_6090000 values (6090000), subpartition SP_6110000 values (6110000), subpartition SP_6170000 values (6170000), subpartition SP_6200000 values (6200000), subpartition SP_6300000 values (6300000), subpartition SP_6250000 values (6250000), subpartition SP_6130000 values (6130000), subpartition SP_6140000 values (6140000), subpartition SP_6160000 values (6160000), subpartition SP_6180000 values (6180000), subpartition SP_6230000 values (6230000), subpartition SP_OTHERS values (default) );