case-kの備忘録

日々の備忘録です。データ分析とか基盤系に興味あります。

BigQueryマスタ更新のベストプラクティスと見解

こちらの記事でベストプラクティスは以下と紹介されており、実運用を考慮した際、現実的には「Data Loadingを利用して追加」する方法が良いようです。
この方法は1テーブルにレコードを追加し、最新のTIME STAMPを参照するVIEWテーブルを作り参照させる方法です。理由としては実運用でテーブルを一旦削除して新しく作るのは怖いのと、DMLだとQuota制限があるのでファイルサイズを考慮する必要があるためです。

f:id:casekblog:20191008122355p:plain
www.slideshare.net
https://www.youtube.com/watch?v=3c9oEZC83Bs

しかし、きになるのはコスト面です。VIEWを参照する場合毎回SQLが実行されるため、最新のTIME STAMPを取るにしてもフルスキャンされます。頻繁に参照されないのであれば問題ないですがBIツールで使われる場合など頻繁に参照される場合はコストが懸念です。
f:id:casekblog:20191008124958p:plain
cloud.google.com
個人的な考えとしてコスト面はパーティションテーブルを作れば解決できるように思いました。新規データをBigQueryに取り込む際にTIME STAMP列を付与し、WHERE句で最新のデータを取得するVIEWを作ればコストを抑えることができます。

※ 単純な時間だけでなく、別の変数を掛け合わせた「時間 × 変数」でパーティションをきっている場合はINSERT時刻ではなく、年月にデータ受領時刻、秒には独自で設定したマスタ情報の値を入れるのもありかと思います。(例) 2019-10-00 00:00:01 ([受領時刻]:[変数のマスタ])
cloud.google.com

仕様によると思いますが、例えば推論モデルやそのほかの仕様で過去のマスタ情報を検索・参照できる点でも更新ではなく追加が良いように思いました。