【BigQuery アップデート情報】トランザクション内でのTRUNCATE TABLEがGAになりました

2023.06.26

2023年6月21日のアップデートでトランザクション内でのTRUNCATE TABLEが正式にサポートされるようになりました。

The following statement types are supported in transactions:

・ DML statements: INSERT, UPDATE, DELETE, MERGE, and TRUNCATE TABLE

Statements supported in transactions

このアップデートの何が嬉しいのか

今回アップデートにより、トランザクションを使った全データの洗い替えが効率的かつ安価にできるようになったと思います。

  • 従来のトランザクションを使った全データの洗い替え
BEGIN

BEGIN TRANSACTION;

DELETE
FROM
  test.wikipedia
WHERE
  TRUE;

INSERT test.wikipedia
SELECT
  *
FROM
  samples_dataset.wikipedia;

COMMIT TRANSACTION;

END;
  • 今回のアップデートでできるようになったこと
BEGIN

BEGIN TRANSACTION;

TRUNCATE TABLE test.wikipedia;

INSERT test.wikipedia
SELECT
  *
FROM
  samples_dataset.wikipedia;

COMMIT TRANSACTION;

END;

具体的にこれができるようになって何が嬉しいのか見ていきましょう。

そもそもTRUNCATE TABLEとは

TRUNCATE TABLEは、DDLの1つでテーブルからすべての行を削除することができます。しかし、テーブルのスキーマ、説明、ラベルなどのメタデータはそのまま残ります。

TRUNCATE TABLE statement

TRUNCATEとDROPとDELETEの違い

TRUNCATEとよく比較される対象にDROPとDELETEがあります。それぞれの違いを見てみましょう。

削除の対象 削除後 BQのスキャン量 削除速度
TRUNCATE 全てのデータ 各種メタデータ 0 瞬時
DROP 全てのデータ 何も残らない 0 瞬時
DELETE WHERE句で指定可能 残ったデータ + 各種メタデータ テーブルのデータ量に依存 テーブルのデータ量に依存

上記の表のようにTRUNCATEは、各種メタデータを残しながら全てのデータを瞬時 & 安価に削除することが可能です。
利用ケースとして、TRUNCATE + INSERTでテーブルの洗い替えを効率良く行うことが可能です。

TRUNCATEの使い方

TRUNCATE構文は非常にシンプルで以下のようなクエリになります。

TRUNCATE TABLE `project_name.dataset_name.table_name`

注意点としてビューやマテリアライズドビュー、外部テーブルは削除することができません。

結局何が嬉しいのか

全データを洗い替えする場合、最初に紹介したクエリのようにTRUNCATEがトランザクションに対応する前はDELETEで全件削除し、INSERTでデータを追加する必要がありました。

DELETE
FROM
  test.wikipedia
WHERE
  TRUE;

INSERT test.wikipedia
SELECT
  *
FROM
  samples_dataset.wikipedia;

しかし、前述した通り、DELETEはスキャン料金がかかり、削除するのにも多少時間がかかるデメリットがありましたが、TRUNCATEはこのようなデメリットは一切ありません。
よって今後は、全データ洗い替えする場合はTRUNCATEで一部データを洗い替えする場合は引き続きDELETEで使い分けをすると良いと思われます。