Массовая загрузка или архивирование данных через 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 создаёт staging-таблицу с гарантированной совместимостью столбцов и скрытых столбцов.
Когда использовать
Для массовых загрузок DWH/ETL, выноса старой секции в архивную таблицу и подготовки индексов и статистики без влияния на рабочую таблицу во время загрузки.
Внимание
Требует опции Partitioning (платная, EE). WITHOUT VALIDATION не проверяет, что строки staging укладываются в границы секции; неверные данные остаются в неверной секции, и запросы могут возвращать неверные результаты; если не уверены, используйте WITH VALIDATION (полное сканирование). Без UPDATE GLOBAL INDEXES глобальные индексы становятся UNUSABLE. Состояния ограничений Unique/PK должны совпадать с обеих сторон.