BigQueryは固定コストがないというメリットがある一方で
クエリ料金が従量課金制になっています。

クエリが参照(スキャン)したデータの総量に基づいて算出されます。

大量のデータを参照して、その結果を確認するなどを繰り返して
予想より高額な請求額となって驚いたことがある方もいるのではないでしょうか。

そこでBigQueryのコスト最適化を考えたいと思います。

参照データを抑制する

参照データを抑制するためにパーティションを活用しましょう。

パーティションと呼ばれるセグメントに分割したテーブルに対してクエリを実行すると、
参照するデータサイズを抑える事ができ、結果コストを抑える事が出来ます。

1例としては、
販売データに対して売上日付をパーティション列に指定し、売上日付を条件に検索すると
テーブル全体にアクセスされることがありません。

◎パーティションの指定を必須にする
パーティションを使いましょうと言っても、指定せずに実行してしまうこともあると思います。
そこで、仕組みで抑制が出来ます。
BigQueryではパーティションを指定せずにクエリが実行出来ない制約を付けることができます。
その制約を付けるとパーティションを指定せずにクエリを実行するとクエリがエラーになります。

クエリ結果を抑制する

SELECT 句で不要なカラムを指定すると、クエリの処理速度が低下したり、
後続のアプリケーションやBIツールへのネットワーク転送量が増大したりします
(BigQueryのクエリ料金には直接関係しませんが、転送コストや処理コストが増加します)。

クエリ結果を抑制し、効率を高めるために、SELECT 句に指定するカラムは必要なものだけにしましょう。

select * from テーブル名 はNGです。
※アプリケーション開発時も悪とされてますよね。

マテリアライズドビューを活用する

デフォルトで有効化されているキャッシュもヒット率が高い場合はコスト削減につながりますが、
よりクエリと結果の場合に最適なのがマテリアライズドビューを活用することです。
マテリアライズドビューはクエリの結果をあらかじめ物理的に保存しておくアプローチで、
参照データの抑制に大きな効果があります。

ドライランを活用する

BigQueryではクエリを実行する前にドライラン実行が行えます。
ドライラン実行は、クエリ実行時の課金データ量、クエリのパフォーマンスを確認出来ます。
結果を見てクエリをチューニングしましょう。