使用 exchange partition 批量加载或归档数据
Oracle分区命令
-- 1) Staging table that exactly matches the target (12.2+):
CREATE TABLE customer_app.sale_stage
FOR EXCHANGE WITH TABLE customer_app.sale_part;
-- 2) Load the staging table and build indexes matching the local indexes:
INSERT /*+ APPEND */ INTO customer_app.sale_stage
SELECT * FROM customer_app.sale_load WHERE created_at >= DATE '2027-01-01';
COMMIT;
CREATE INDEX customer_app.sale_stage_customer_ix ON customer_app.sale_stage (customer_id);
-- 3) Swap (dictionary-only operation, no data movement):
ALTER TABLE customer_app.sale_part
EXCHANGE PARTITION p2027 WITH TABLE customer_app.sale_stage
INCLUDING INDEXES WITHOUT VALIDATION
UPDATE GLOBAL INDEXES;
-- 4) Verify:
SELECT COUNT(*) FROM customer_app.sale_part PARTITION (p2027);
SELECT index_name, partition_name, status
FROM dba_ind_partitions
WHERE index_owner = 'CUSTOMER_APP' AND status <> 'USABLE';作用
在数据字典中将一个分区的段与一个普通表的段互换;数百万行可在几秒内"进入"表,或"离开"表进行归档。FOR EXCHANGE WITH TABLE 会创建一个保证列和隐藏列兼容的暂存表。
适用场景
用于 DWH/ETL 批量加载、将旧分区移出到归档表,以及在加载期间不影响在线表的情况下准备索引和统计信息。
注意
需要 Partitioning 选件(EE 额外付费)。WITHOUT VALIDATION 不检查暂存表中的行是否符合分区边界;错误的数据会留在错误的分区中,查询可能返回错误结果;不确定时请使用 WITH VALIDATION(全量扫描)。不使用 UPDATE GLOBAL INDEXES 时,全局索引会变为 UNUSABLE。两侧的唯一/PK 约束状态必须一致。