メニュー
Amazon Redshift
データベース開発者ガイド (API Version 2012-12-01)

列リストを指定してマージ操作を実行する

列リストを指定してマージ操作を実行するには、以下の手順を実行します。

  1. 問題が発生した場合に全体をロールバックできるよう、処理全体を単一のトランザクションにまとめます。

    Copy
    begin transaction; … end transaction;

  2. 次の疑似コードに示すように、ステージングテーブルを作成し、マージの対象となるデータを移します。

    Copy
    create temp table stage (like target); insert into stage select * from source where source.filter = 'filter_expression';

  3. ステージングテーブルで内部結合を使用して、ターゲットテーブルを更新します。

    • UPDATE 句で、更新の対象となる列を明示的にリストします。

    • ステージングテーブルで内部結合を実行します。

    • 分散キーがプライマリキーと異なり、分散キーが更新の対象でない場合は、冗長結合を分散キーに追加します。クエリでコロケーテッド結合を使用するかどうかを確認するには、EXPLAIN を使用してクエリを実行し、結合すべてに DS_DIST_NONE があるかどうかを確認します。詳細については、「クエリプランの評価」を参照してください。

    • ターゲットテーブルがタイムスタンプでソートされる場合、述語を追加し、ターゲットテーブルの範囲限定スキャンを活用します。詳細については、「クエリの設計のベストプラクティス」を参照してください。

    • マージですべての行を使用しない場合は、変更を必要とする行をフィルタリングします。たとえば、1 つ以上の列に不等フィルタを追加して、変更されていない列を除外します。

    • 問題が発生した場合に全体をロールバックできるよう、更新操作、削除操作、挿入操作を単一のトランザクションにまとめます。

    以下に例を示します。
    Copy
    begin transaction; update target set col1 = stage.col1, col2 = stage.col2, col3 = 'expression' from stage where target.primarykey = stage.primarykey and target.distkey = stage.distkey and target.col3 > 'last_update_time' and (target.col1 != stage.col1 or target.col2 != stage.col2 or target.col3 = 'filter_expression');

  4. ターゲットテーブルで内部結合を使用して、ステージングテーブルから不要になった行を削除します。ターゲットテーブルの一部の行はすでにステージングテーブルの対応する行に一致し、その他は前のステップで更新されました。どちらの場合も、挿入のために必要ありません。

    Copy
    delete from stage using target where stage.primarykey = target.primarykey;

  5. ステージングテーブルから残りの行を挿入します。ステップ 2 の UPDATE ステートメントで使用した列リストと同じものを VALUES 句内で使用します。

    Copy
    insert into target (select col1, col2, 'expression') from stage; end transaction;

  6. ステージングテーブルを削除 (Drop) します。

    Copy
    drop table stage;