2016-09-07 7 views
0

現在、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; 

何とかパーティションを分割するのは、挿入を行うよりも遅いプロセスのようです。これは期待された動作ですか、何か不足していますか?

+0

ステージングテーブルを使用する必要がありますか?メインのパーティションテーブルに直接挿入できませんか? –

答えて

0

状況によっては、高速分割最適化があります。しかし、あなたの説明から、INSERT/+ * APPEND */ を実行するだけです。リソースがあり、インサートを高速化しようとしている場合は、いくつかの並列処理を採用することもできます。

関連する問題