and,a株式会社 デジタルマーケティングエンジニア 佐藤洋太
GA4+BigQueryを利用していてこのようなエラーに出くわすことはありませんか?
エラーメッセージ:
Quota exceeded: Your project exceeded quota for free query bytes scanned. For more information, see https://cloud.google.com/bigquery/docs/troubleshoot-quotas
このエラーはサンドボックスモードを利用していて、プロジェクトの無料クエリ使用分の限界に達した際に発生するエラーです。
SQLを試したい時にこのエラーが出ると非常に厄介です。
有料にすれば解決では?と思いますが、Billing情報を登録してサンドボックスモードを解除したとしても、大きなクエリはお金がかかってしまうため、結局のところクエリコストを如何に減らせるかがキモになってきます。結局はコストを減らす点、クエリの効率化を行うという点からは逃れられません。
このような背景から、今回は開発時に簡単に使えるクエリコストの軽減テクニックを考えてみます。また、このテクニックは無料使用分でも使えるテクニックですのでご参考にどうぞ。
一時テーブルとは?
そこで登場するのが一時テーブルという機能です。
公式のアナウンス:
https://cloud.google.com/bigquery/docs/multi-statement-queries?hl=ja#temporary_tables
一時テーブルを使用すると、中間結果をテーブルに保存できます。この一時テーブルはセッション レベルで存在するため、データセット内での保存や管理の必要はありません。
複数ステートメント クエリで一時テーブルを作成して参照できます。一時テーブルが不要になったら、手動で削除するか、BigQuery が 24 時間後に削除されるのを待ちます。
https://cloud.google.com/bigquery/docs/multi-statement-queries?hl=ja#temporary_tables
一時テーブルはコピー&ペーストの際のクリップボードのような一時的な保存領域と覚えておきましょう。コスト低減以外にも様々なメリットがあるので必須のテクニックかと個人的には考えています。
公式のドキュメントにもSQLソースの記載はありますが、正直めんどくさい・・・という方向けに楽に作る方法をご紹介します。
実践
工程
1:準備
まずは、クエリエディタを開きます。

2:設定
クエリ設定から「一時テーブルにクエリ結果を保存」を選択し、保存します。


3:SQLの実行
任意のSQLをペーストし、実行します。
今回はごく簡単なSQLを実行します。

4:テーブルが作成されたかの確認
先ほどのクエリ結果画面からジョブ詳細を選択すると宛先テーブルの行にTemporary table という文字がハイライトされています。

Temporary table をクリックすると一時テーブルのスキーマ画面が開きます

ここからクエリを選択して開くとSQLが発行されます
このSQLを実行すると先ほどの結果と同じものが保存されていることが確認できます

画像内のFROM句の文字列が一時テーブルの所在になっています。
下記が一時テーブルの住所です。
`project_id._af0a1e64d3998259dfc43b27b34d1c5d90d1bdcd.anonfd8da7be_cd28_49e0_9c05_8e0f0be12a60`
以上で一時テーブルを作成する操作は終わりです。
画面の操作だけで完結するのでほぼ問題ないと思います。
実際にどれぐらい変わるの?
では実際にどれぐらいコスト低減効果があるのかを試してみます。
今回は140GBを超えるGA4のテーブルに直接アクセスして比較しました
結果:


・経過時間が10秒ほど短くなっている
・消費したスロット時間が大幅に減少
この2点が大きな違いです。
スロット時間の消費は料金に対して直接影響がある部分ですので減少は大きなメリットですね。
最後に
重いテーブルを何回もスキャンするなら一時テーブルに保存してからクエリを開発する形がベストと思います。もちろん中間テーブルを利用するのも有用だと思います。特に有料版ではスケジュールクエリなどを利用して中間テーブルを作成することを強くお勧めします。
コメント