テーブルの最終更新日をINFORMATION_SCHEMA.PARTITIONSから調査する

この記事は、BigQuery Advent Calendar 2021の23日目の記事です。8日目の記事も書いているので、このAdvent Calendarで2つ目の記事になります。メタデータ大好き人間なので、今日のネタもメタデータ関連です。

テーブルの最終更新日が知りたい

データ基盤の管理をやっていると、テーブルの最終更新日が知りたい!ということは多いです。具体的には「9時までにデータ転送終わっていないとまずいから、テーブルの最終更新日と時刻を比較して監視を入れておきたい」とかですね。監視はSQLを使ってやるのが簡単で、今年は自社のTech Blogにも実例をいくつか書いていました。

update_atのようなカラムが存在する場合SELECT MAX(update_at) FROM...のようなSQLを書けばいいわけですが、このやり方は以下のように案外できない場合があります。

  • 一週間に一回程度の頻度でしかレコードが更新されない
  • update_atのようなカラムがそもそも存在しないテーブルである

こういったケースにも対応することを考えると、update_atのような具体的なカラムではなくメタデータから最終更新日を知りたくなります。

古の方法: __TABLES__を使う

テーブルの最終更新日を知るために、昔は__TABLES__をよく使っていました。データセット内のテーブルやビューの一覧を出しつつ、最終更新日や行数、物理サイズなどが分かります。

SELECT
  *
FROM
  `my-project`.source__db.__TABLES__

f:id:syou6162:20211218134354p:plain
__TABLE__の例

一見便利に見える__TABLES__ですが、ドキュメントがなかったり、パフォーマンスに問題がある、ということで積極的に使っていくのは今後は避けたほうがよさそうです。

INFORMATION_SCHEMA.PARTITIONSを使おう

では、どうするのがいいか?メタデータと言えばINFORMATION_SCHEMAですが、ぱっと見ドキュメントを見るだけだと__TABLES__に相当するものがなさそうに見えます。が、実はINFORMATION_SCHEMA.PARTITIONSに存在していました...!教えてくれたid:nii_yanさん、ありがとうございました。

実際の出力としては以下のような形になります。ストレージ料金にも関わってくるstorage_tierなどの情報も追加されていて、(名前が分かりにくい以外は)INFORMATION_SCHEMA.PARTITIONSを今後使っていくとよさそうですね。

SELECT
  *
FROM
  `my-project.source__db.INFORMATION_SCHEMA.PARTITIONS`

f:id:syou6162:20211218135442p:plain
INFORMATION_SCHEMA.PARTITIONSの出力例

来年もメタデータでhappyなデータ基盤生活をしていきたいですね。