こんにちは、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時テーブルを使えばテーブルに対する読み込みには課金はありますが、ストレージには課金されません。可能な限りサマった集計結果を保存して使いまわすことでコスト節約が期待できます。