BigQuery クエリコストについて

こんにちは、ATです。

最近、BigQueryのクエリを書いていて気になったことがあったのでメモしときます。(2022/03/18時点の内容)

BigQueryをオンデマンドで使ってるとクエリ実行時の課金額が気になりますよね。 オンデマンドでは、読んだデータ量に応じて課金されるので、どのくらいのデータ量なのか気にしつつクエリ叩いてたりして。なのでなるべくデータ量を少なくするためにカラムを必要なものだけ指定したり、テーブルをパーティションテーブルにする、といった対策をしてると思います。その延長線でサブクエリの使い回しとかでもデータ量節約できないか?みたいな感じでWITH句使ってたりしてました。

ところが、
https://cloud.google.com/bigquery/docs/cached-results

ここを見るとどうもそうではないようです。

同じクエリを重複して実行すると、BigQuery はキャッシュに保存された結果を再利用しようとします。キャッシュからデータを取得するには、重複するクエリテキストを元のクエリと同じにする必要があります。
キャッシュに保存された結果を使用したクエリは、課金の対象となりませんが、BigQuery の割り当てポリシーの対象にはなります。

とあり、キャッシュを使えれば課金されないことがわかります。 おそらくなんとなくこれを覚えていて、サブクエリをWITH句にしとけばキャッシュが効くと勝手に脳内補完されていました。その為とりあえずサブクエリをWITH句で書く癖がついていました。 しかしながら下記リンク先を見ると、

https://cloud.google.com/bigquery/docs/best-practices-performance-compute

クエリ内の複数の場所で使用される共通テーブル式がクエリに含まれている場合、それらは参照されるたびに評価されます。これにより、内部クエリの複雑さとリソースの消費量が増加する可能性があります。

となっており、そうは甘くないようです。BigQueryはヤワではない。 と言う訳でこのアプローチの道は閉ざされました。では、どうすれば少しでも読み込み量を節約できるか?それについても上記引用に答えが書いてありました。 1時テーブルを使用する方法です。
1時テーブルを使えばテーブルに対する読み込みには課金はありますが、ストレージには課金されません。可能な限りサマった集計結果を保存して使いまわすことでコスト節約が期待できます。


株式会社grasys(グラシス)は、技術が好きで一緒に夢中になれる仲間を募集しています。

grasysは、大規模・高負荷・高集積・高密度なシステムを多く扱っているITインフラの会社です。Google Cloud、Amazon Web Services (AWS)、Microsoft Azureの最先端技術を活用してクラウドインフラやデータ分析基盤など、ITシステムの重要な基盤を設計・構築し、改善を続けながら運用しています。

お客様の課題解決をしながら技術を広げたい方、攻めのインフラ技術を習得したい方、とことん技術を追求したい方にとって素晴らしい環境が、grasysにはあります。
お気軽にご連絡ください。