新しいデータの更新と挿入
既存のテーブルに新しいデータを追加するとき、更新と挿入を組み合わせてステージングテーブルから行うと効率的です。Amazon Redshift は merge または upsert (1 つのデータソースからテーブルを更新するコマンド) をサポートしていないものの、ステージングテーブルを作成し、このセクションに示した方法のいずれかを使ってステージングテーブルからテーブルを更新すれば、マージオペレーションを実現することができます。
トピック
マージ操作は、一時的に使用するステージングテーブルを作成してから削除するまでを除き、全体を 1 つのトランザクションで実行する必要があります。このようにしておけば、いずれかの段階が失敗した場合でもトランザクションのロールバックができます。トランザクションを 1 つにすると、ほかにもコミットの回数が減るため、時間とリソースの節約になります。
マージ方法 1: 既存の行を置き換える
テーブルの行すべてを上書きする場合には、更新される行を内部結合を使って削除し、既存の行を置き換える方法であれば、対象となるテーブル (ターゲットテーブル) を 1 回だけスキャンすればよいため、最も時間をかけずにマージを実行できます。行は削除されると、1 回の挿入操作によってステージングテーブルの新しい行と置き換えられます。
この方法は、以下の条件のすべてに該当する場合に使用してください。
-
ターゲットテーブルとステージングテーブルに同じ列が含まれる。
-
ターゲットテーブルの列のデータをすべて、ステージングテーブルの列で置き換えることを予定している。
-
マージでステージングテーブルの行をすべて使用する。
ここに挙げた条件のなかに当てはまらないものがあった場合には、以下のセクションで説明する「方法 2 : 列リストを指定する」を使用します。
ステージングテーブルの行すべてを使用するわけではない場合には、DELETE ステートメントおよび INSERT ステートメントに WHERE 句を使用して、実際に変更がない行を除外することができます。ただし、マージでステージングテーブルの行の大部分を使用しない場合には、このセクションで後ほど説明するように UPDATE と INSERT を別個に実行する方法を推奨しています。
マージ方法 2: 列リストを指定する
行全体を上書きするのではなく、テーブルの特定の列を更新する場合には、この方法を使用します。この方法は、更新のための手順が余分に加わるため、前の方法よりも時間がかかります。このため、以下の条件のいずれかに該当する場合にこの方法を使用してください。
-
テーブルの列すべてを更新するわけではない。
-
更新でステージングテーブルの行のほとんどを使用しない。