データ操作言語

BigQuery のデータ操作言語(DML)を使用して、BigQuery テーブルのデータを更新、挿入、削除できます。

DML ステートメントは、次の条件が満たされている場合、SELECT ステートメントと同じように実行できます。

  • 標準 SQL を使用する必要があること。標準 SQL を有効にするには、SQL 言語の切り替えをご覧ください。
  • 宛先テーブルを指定できないこと。たとえば、Cloud Console では、[宛先テーブル] を [表が選択されていません] に設定する必要があります。

    Cloud Console で宛先テーブルが選択されていません。

制限事項

  • 各 DML ステートメントは、暗黙のトランザクションを開始します。つまり、成功した各 DML ステートメントの終了時に、ステートメントによる変更が自動的にコミットされます。

  • ストリーミング(tabledata.insertall メソッドまたは Storage Write API)を使用してテーブルに書き込まれた行は、UPDATEDELETEMERGE ステートメントを使用して変更することはできません。最近の書き込みとは通常、30 分以内に行われたものを指します。テーブルの他のすべての行は引き続き、UPDATEDELETEMERGE ステートメントを使用して変更できることに注意してください。

  • MERGE ステートメントにおける when_clausesearch_conditionmerge_update_clausemerge_insert_clause 内の相関サブクエリはサポートされていません。

  • DML ステートメントを含むクエリでは、クエリ対象としてワイルドカード テーブルを使用できません。たとえば、UPDATE クエリの FROM 句ではワイルドカード テーブルを使用できますが、ワイルドカード テーブルを UPDATE オペレーションの対象として使用することはできません。

同時実行ジョブ

BigQuery は、テーブル内の行を追加、変更、削除する DML ステートメントの同時実行を管理します。

INSERT DML の同時実行

24 時間の間に、テーブルに INSERT する最初の 1,500 件のステートメントが同時に実行されます。この上限に達すると、テーブルに書き込む INSERT ステートメントの同時実行数は 10 件に制限されます。10 件を超えた INSERT DML ジョブは、PENDING 状態でキューに入れられます。先に実行中だったジョブが終了すると、次の保留中のジョブがキューから出されて実行されます。現在、1 つのテーブルに対して最大 100 件の INSERT DML ステートメントを、いつでもキューに入れることができます。

UPDATE、DELETE、MERGE DML の同時実行

UPDATEDELETEMERGE DML ステートメントは、変更 DML ステートメントと呼ばれます。あるテーブルに対して 1 つ以上の変更 DML ステートメントを送信したときに、他の変更 DML ジョブが実行中(または保留中)である場合、BigQuery はそれらのうち最大 2 個を同時に実行し、最大 20 個が PENDING としてキューに入れられます。実行中のジョブが終了すると、次の保留中のジョブがキューから出され、実行されます。現在、キューに入れられる変更 DML ステートメントはテーブルごとのキューを共有し、キューの最大長は 20 です。各テーブルの最大キュー長を超える追加のステートメントは失敗します。

インタラクティブ優先の DML ジョブが 6 時間以上キューに入ったままになると、失敗します。

DML ステートメントの競合

同じテーブルで変更 DML ステートメントを同時に実行すると、変更が競合して失敗することがあります。このような失敗が発生した場合、BigQuery は再試行します。

  • 行をテーブルに挿入する INSERT DML ステートメントは、同時に実行される他の DML ステートメントと競合しません。

  • INSERT 句だけを含み、UPDATE 句または DELETE 句を含まない MERGE DML ステートメントは、同時に実行される他の DML ステートメントと競合しません。

  • UPDATE 句または DELETE 句を含む MERGE DML ステートメントは、その MERGE ステートメントが既存の行を更新または削除しない限り、同時に実行される他の DML ステートメントと競合しません。たとえば、新しい行のみを挿入する MERGE ステートメントは、同時に実行される他の DML ステートメントと競合しません。

料金

DML の料金については、料金ページのデータ操作言語の料金をご覧ください。

ベスト プラクティス

最適なパフォーマンスを得るために、次のパターンをおすすめします。

  • 個別の行の更新や挿入を大量に送信しないでください。可能であれば、DML オペレーションをグループ化します。詳細については、単一行を更新または挿入する DML ステートメントをご覧ください。

  • 古いデータ、または特定の期間内に更新または削除が行われる場合は、テーブルのパーティショニングを検討してください。パーティショニングにより、変更をテーブル内の特定のパーティションのみに限定できます。

  • 各パーティションのデータ量が小さく、各更新の際にテーブル内の大部分のパーティションを変更している場合は、テーブルのパーティショニングを行わないようにします。

  • 1 つ以上の列が、値の狭い範囲内に収まる行を更新する場合は、クラスタ化テーブルの使用を検討してください。クラスタリングを行うことで、変更が特定の一連ブロックに制限されるため、読み取りと書き込みが必要なデータの量が削減されます。以下は、列の値の範囲をフィルタする UPDATE ステートメントの例です。

    UPDATE s = "some string" WHERE id BETWEEN 54 AND 75
    

    次に、列の値の小さなリストをフィルタする類似の例を示します。

    UPDATE s = "some string" WHERE id IN (54, 57, 60)
    

    このような場合には、id 列のクラスタリングを検討してください。

  • OLTP 機能が必要な場合は、Cloud SQL 連携クエリの使用を検討してください。これにより、BigQuery は Cloud SQL に存在するデータをクエリできるようになります。

次のステップ

  • DML 構文の情報とサンプルについては、DML 構文をご覧ください。
  • スケジュールされたクエリで DML ステートメントを使用する方法については、クエリのスケジューリングをご覧ください。