BigQuery でクエリ結果が大きすぎて実行できない時の対処法

BigQueryでクエリ結果が大きすぎて実行できない時、クエリを分割したり、カラム数を減らしたり、WHERE句でフィルタリングして減らす、というのは誰もが思いつくと思いますが、どうしても一発で確認したい時もあります。

意外と知られていないかもしれないので、今回はクエリ結果が大きい場合でも一発で実行&結果を確認する方法についてご紹介したいと思います。

BigQueryでクエリ結果が大きすぎて実行時エラー

BigQuery でクエリ結果が大きすぎるときのエラーは以下の通りです。

Response too large to return. Consider specifying a destination table in your job configuration. For more details, see https://cloud.google.com/bigquery/troubleshooting-errors

こんな感じでいつものように実行していると思いきや、、

しばらくすると、以下のようなエラーになります。

ちなみに私は、BigQuery で結果が大きすぎるエラーを見たのは今回が初めてでした。

https://cloud.google.com/bigquery/docs/writing-results?hl=ja#large-results

解決策:大きな結果を許可する

<bq コマンドライン ツールを使用する場合>

<ブラウザツールを使用する場合>

まずは、クエリエディタのメニューバーにある「展開」から「クエリ設定」を開きます。

次に、送信先として任意のテーブル(新規作成も可)を指定します。
※一時テーブルでは大容量の結果はNGです

・「クエリ結果の宛先テーブルを設定する」を選択
・送信先として任意のテーブル(新規作成も可)を指定します。
・結果サイズの「大容量の結果を許可する(サイズ上限なし)」にチェックをいれる
・「保存」します

保存すると、クエリエディタの下部に宛先テーブルと、「大容量の結果の許可」というタグがつきます。この状態でクエリを実行すると、どれだけ大きな結果でも返ってきます。結果は、指定した宛先テーブルに保存されているため、ブラウザを閉じてもいつでも確認できます。

今回の例では、クエリ結果は8億件ありました。

どこで時間がかかっているのか、何件処理されているのか、というのも実行グラフで確認できます。複数のテーブルを結合するような複雑なクエリの場合は、こちらを確認するのもいいかもしれません。

その他の解決策

なお、他にも一般的な対処法としては、以下のようなものがありますのでご参考までに。

①クエリを最適化する

クエリのパフォーマンスを最適化することで、処理時間を短縮することができます。例えば、必要なカラムだけを選択したり、余分なJOINを減らしたり、WHERE条件を使ってフィルタリングしたりすることが考えられます。

②クエリを分割する

クエリを複数のクエリに分割して実行することで、処理時間を短縮することができます。例えば、テーブルを日付ごとに分割することで、1つのクエリが処理するデータ量を減らすことができます。

③BigQueryをストレージAPIとして使用する

BigQueryはストレージAPIとしても使用できます。この場合、クエリを実行する代わりに、ストレージAPIを使用してデータを取得することができます。

④BigQueryのリソースを拡張する

BigQueryのリソースを拡張することで、クエリの実行時間を短縮することができます。例えば、BigQueryのリソースを増やしたり、分散処理のためのパーティションを設定したりすることが考えられます。

まとめ

  • BigQuery の「大容量の結果を許可」オプションを使用すれば、サイズ上限なくクエリ結果を取得できる
  • 一時テーブルでは「大容量の結果を許可」オプションは利用不可
  • 他にも、クエリ最適化や分割などの解決策がある