BigQueryはパーティション分割テーブルを使うことで、パフォーマンスやコストを最適化することができます。
しかし、公式のドキュメントには分割された各パーティション毎のデータサイズを求める方法が書かれていません。
__PARTITIONS_SUMMARY__
メタテーブルを使うことで、パーティションの一覧やそれらの作成・更新時刻を確認することはできますが、このテーブルにサイズの情報はありません。
では、どうやってパーティション毎のサイズを確認できるのでしょうか?
解決策
各パーティションに対して、パーティション内をフルスキャンするクエリをdry runし、推定スキャン量のデータを使う。
partitions = [
'2020-01-01',
'2020-01-02',
'2020-01-03',
]
partitions.each do |partition|
sql = "SELECT * FROM <テーブル名> WHERE DATE(<パーティションカラム>) = '#{partition}'"
command = "bq query --nouse_legacy_sql --dry_run \"#{sql}\""
res = `#{command}`
m = res.match(/(\d+) bytes/)
if m
bytes = m[1].to_i
puts "#{partition}, #{bytes}"
end
end
dry runであればクエリ料金がかからないことを利用して、パーティションのサイズを調査しています。
あとは、この情報をCSVとしてGoogle SheetやBQに入れることでさらなる調査ができます。