【アップデート情報】テーブルの変更履歴を取得するCHANGES関数が新たに追加されました
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
Google Cloudデータエンジニアのはんざわです。
2024年7月22日のアップデートでCHANGESのテーブル関数がプレビューとして、新たに追加されました。
本ブログでは、追加されたばかりのCHANGESのテーブル関数を触ってみたいと思います。
CHANGES とは?
CHANGESのテーブル関数では、BigQueryのテーブル変更履歴を追跡することができます。
BigQueryのコンソール画面からSQLで指定した時間範囲に行われた特定の種類の変更を確認することができます。
似たようなテーブル関数にAPPENDSが存在します。
APPENDSとCHANGESでは、取得可能な情報が若干異なります。
APPENDSで取得可能な情報は次の通りです。
CREATE TABLEのDDLステートメント
INSERTのDMLステートメント
MERGEのDMLステートメントで追加されたデータ- BigQueryへのデータロード
- ストリーミングによるデータの取り込み
同様にCHANGESで取得可能な情報は次の通りです。
CREATE TABLEのDDLステートメント
INSERTのDMLステートメント
MERGEのDMLステートメントで変更されたデータ
UPDATEのDMLステートメント
DELETEのDMLステートメント- BigQueryへのデータロード
- ストリーミングによるデータの取り込み
TRUNCATE TABLEのDMLステートメント
WRITE_TRUNCATEで構成されたジョブ- 個々のテーブルのパーティションの削除
これらを比較して分かるようにCHANGESはAPPENDSよりも多くの変更情報を取得することが可能になっています。
さっそくですが、CHANGESを触ってみたいと思います。
CHANGES を触ってみる
CHANGES(
  TABLE table,
  start_timestamp DEFAULT NULL,
  end_timestamp)
CHANGESの使い方は非常に簡単です。
上記のようにTABLEにテーブル名を与え、テーブルの変更履歴を確認したい期間をstart_timestampとend_timestampに与えるだけで確認することができます。
start_timestampには、NULLを指定することも可能でテーブル作成以降の全てのテーブルの変更履歴を取得することが可能です。
一方でend_timestampには、少なくとも現在の時刻から10分前である必要があり、start_timestampとend_timestampの間の最大時間範囲は1日である必要があるようです。
end_timestampに現在の時刻から10分以内の時刻を与えると次のようなエラーが発生することを確認しています。
試しに適当なテーブルの変更履歴を以下のクエリで確認してみます。
SELECT
  *
FROM
  CHANGES(
    TABLE samples.github_nested,
    TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY),
    TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 15 MINUTE)
  )
ですが、実行すると以下のようなエラーが発生しました。
どうやらテーブルの変更履歴を確認するためには、enable_change_historyのオプションをTRUEにする必要があるようです。
別途、以下のクエリでenable_change_historyのオプションを有効にしたテーブルを作成し、変更履歴を確認してみたいと思います。
CREATE TABLE samples.change_history
OPTIONS (
>  enable_change_history = TRUE
) AS
SELECT
  1 AS id,
  'apple' AS name
また、INSERTとUPDATEとDELETEステートメントも実行してみます。
/* INSERT Statement */
INSERT INTO samples.change_history
SELECT
  2 AS id,
  'banana' AS name
/* UPDATE Statement */
UPDATE samples.change_history
SET
  name = 'melon'
WHERE
  id = 2
/* DELETE Statement */
DELETE samples.change_history
WHERE
  id = 2
改めて以下のクエリで変更履歴を確認してみます。
SELECT
  *
FROM
  CHANGES (
    TABLE `samples.change_history`,
    TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY),
    TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 15 MINUTE)
  )
全てのデータ操作が以下のキャプチャのように確認することができました!

料金について
変更履歴を確認するためにenable_change_historyをTRUEに設定すると、BigQueryはテーブルの変更メタデータを保存するようになります。
このメタデータの保存には、BigQueryのストレージコストが発生するようになります。
通常であれば少額で済みますが、変更操作が多いテーブルや大規模なテーブルのデータ操作は予想外の課金が発生する可能性があるので気をつけましょう。
まとめ
今回のブログでは、新たにプレビューで追加されたCHANGESを紹介しました。
この機能を有効にすることでデータの更新履歴の管理が容易になると思われます。
追加で課金が発生するようになりますが、是非活用を検討してみてください。











