BigQueryでWHERE句で絞り込んでもデータ抽出コストが高い問題

BigQueryで大きめの日別テーブルを参照する際に、なぜかめちゃくちゃコストが大きくなってしまったのでメモ。

結論としては、WHERE句で期間を絞り込む際に、ある記述をしてしまうと限定された範囲での抽出を行うのではなく、データ全量をなめてみてしまうのが原因。

たとえば、以下の例がNG。

このクエリではWITH句を使って、カレンダーテーブルから日付のユニークをサブクエリ持たせている。

データ抽出ではよくあることだが、同じ集計内容のクエリにおいて日付のみを書き換え可能にすることで、汎用性を高めるのが目的。

次にメインテーブルのWhere句において、サブクエリの日付を指定し、日付を絞り込もうとした。

しかし調査の結果、これは一度データ全量見てしまった後に、範囲を絞り込んで結果を返してくる。

なので、コストもめちゃくちゃ大きくなってしまう。

そこでチューニングした結果がこちら。


テンポラリーの関数を定義することで、日付のみの書き換えを可能にしている。

実際の実行時には、WHERE句にはきちんと日付がユニークで格納されるので、データ抽出の範囲を絞り込むことができ、コストもかからずに済んだ。

※仕様変更や環境によっては現象は異なるので、あくまでもメモ程度に