現在、Oracle 12cでデータロードプロセスをリファクタリングしており、ソリューションとしてパーティション化を検討中です。私のデータは日付で分類されており、日付ごとに〜500k個のレコードがあり、パーティション化に「最小限の最適」に収まるように見えます。当初の計画では、ステージングテーブルを使用してデータをロードした後、メインテーブルにダミーパーティションを追加してパーティション交換を実行しました。しかし、データロードには、1日ではなく数日からのデータが含まれています。挿入を実行を追加:Oracleパフォーマンス:パーティション分割と挿入の挿入
オプション1:予備的研究は、この問題を解決するには2つの方法がある示唆
ALTER TABLE MAIN_TABLE ADD PARTITION DUMMY_PARTITION VALUES LESS THAN (TO_DATE('1-1-9999', 'DD-MM-YYYY'));
ALTER TABLE MAIN_TABLE
EXCHANGE PARTITION DUMMY_PARTITION
WITH TABLE STAGING_TABLE
WITHOUT VALIDATION UPDATE GLOBAL INDEXES;
BEGIN
FOR row IN (select distinct to_char(DATE_FIELD+1, 'YYYYMMDD') DATE_FIELD from PARTITIONED_TABLE order by DATE_FIELD)
LOOP
EXECUTE IMMEDIATE 'ALTER TABLE MAIN_TABLE SPLIT PARTITION DUMMY_PARTITION AT (TO_DATE('''||row.DATE_FIELD||''', ''YYYYMMDD'')) INTO (PARTITION p'||row.DATE_FIELD||', PARTITION DUMMY_PARTITION) UPDATE GLOBAL INDEXES';
END LOOP;
END;
/
オプション2パーティション交換を実行し、次にループに大きなパーティションを分割
INSERT /*+ append */ INTO MAIN_TABLE SELECT * FROM STAGING_TABLE;
何とかパーティションを分割するのは、挿入を行うよりも遅いプロセスのようです。これは期待された動作ですか、何か不足していますか?
ステージングテーブルを使用する必要がありますか?メインのパーティションテーブルに直接挿入できませんか? –