💿
BigQueryのMERGEステートメントについて
what
- BigQueryのマージステートメントについて調べたことや知ったことを個人的にまとめたもの
MERGEステートメントとは
別のテーブルと一致する値に基づいて以下のステートメントをまとめて実行できる機能のこと。
データの一貫性を保ちながら、効率的にテーブルの差分更新を行うことができる。
- INSERT(挿入)
- UPDATE(更新)
- DELETE(削除)
次のような場合に利用されることが多い
- データ同期
- CDC(Change Data Capture)
特に「日次バッチなどで差分データを効率的にメインテーブルに反映させたい場合」には特に利用されることが多い
INSERT、UPDATE、DELETEとの関係
INSERT
- MERGEでの役割: ソーステーブルには存在するが、ターゲットテーブルには存在しない行を、ターゲットテーブルに新しく追加(挿入)する
UPDATE
- ソーステーブルとターゲットテーブルには両方存在する行で、かつ特定の条件(データが更新されている等)を満たす場合に、ターゲットテーブルの該当業を更新する
DELETE
- ターゲットテーブルには存在するが、ソーステーブルには存在しない行を、ターゲットテーブルから削除する。これは、ソーステーブルに存在しないデー穢多はターゲットテーブルからも削除すべき、という場合に利用する
MERGEステートメントの実行上限について
BigQueryには1日において実行できるジョブの回数が決まっている。
MERGEをはじめとするDMLステートメントについては1日あたりの実行回数に上限はない。
しかし、DMLステートメントには以下の利用制限が適用されている。
同時実行の制限
- MERGE、UPDATE、DELETEステートメントは1つのテーブルにつき、同時に最大2つまでしか実行できない
- 2つを超えたDMLジョブが送信された場合、それらは自動的にキューに送られ待ち状態となる
- INSERTステートメントは最初の1500件は即時実行され、その後は10この同時実行されるという異なる制限がある
実行レートの制限
- プロジェクト内の各テーブルに対して、10秒ごとに最大25個のDMLステートメントを実行できる
キューでの最大待機時間
- インタラクティブなDMLステートメントは、キューで最大6時間待機できる
- 6時間を超えた場合ステートメントは失敗扱いになる
同時実行による競合と再試行
- 同時に実行された変更DMLステートメント(MERGE, UPDATE, DELETE)がテーブル内の同じパーティションを変更しようとした場合、競合が発生し失敗することがある
- この場合、BigQueryは最大3回まで再試行を行う
Discussion