パーティション交換で一括ロードまたはデータをアーカイブ
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制約の状態は両側で一致している必要がある。