BigQueryでサブクエリが多いかクエリが複雑なのでリソース不足と言われる

      2018/10/20

こんにちは、データアナリストのTEN(@02smwhere)です。

GoogleのBigqueryでデータ分析をしていた際に、困ったので備忘録。

“Query Failed”と表示されてクエリが実行されず、以下のエラーメッセージが表示された。

Error: Resources exceeded during query execution: Not enough resources for query planning - too many subqueries or query is too complex..

 
要するに、SQLのサブクエリが多すぎるか、クエリが複雑すぎてリソースが足りないために、実行できないらしい。

 

スポンサーリンク

問題が起きた背景

WITH句やLEFT JOINなどを含めて、サブクエリが10個くらいで作られたクエリ。

上から下までで800行ほどのSQLを実行したが、エラー。

データマートはすべてDWH上に保存済。

 

解決策

色々戦ってみたが、解決策としては以下の手順で大きめの実行結果のオプションを有効化した上で、中間テーブルを生成するのが良いらしい。

なので、一旦はクエリ全体をデバッグして、中間テーブルを作成、再びそれを参照できるように、WITH句などをうまく使って書き換える必要がある。

 
要するに、バカでかいクエリ1つにこだわるよりも、2つに分けて実行したほうが、仕事は早く進むでしょ?って考え方。

 
スクリーンショット 2018 10 20 14 53 22

旧版UIの場合、参照テーブルなどから“COMPOSE QUERY”をクリック、クエリ作成画面を開く。

“Show Options”を押すと、クエリ作成に関する様々なオプションが選択できるようになる。

 
スクリーンショット 2018 10 20 14 53 38

“Destination Table”から作成する中間テーブルの名前と、データセットを置く場所を指定する。

さらに“Results Size”“Allow Large Results”にチェック。

これで巨大な実行結果でも、途中で止まることなく最後まで実行して、返ってきた結果を中間テーブルとして保存できる。

あとは分けた後半のクエリを実行する際に、作成した中間テーブルを参照して“COMPOSE QUERY”すれば良い。

(実行クエリと結果次第でお金の負担が増えるので、あくまでチューニングは忘れずに)

 

スポンサーリンク

その他試した方法

似たようなエラーがある場合の解決策として、JOINをJOIN EACHという構文に置き換える方法がある。

JOIN先?元?のデータが大きいと同じエラーが出るようだが、今回はうまくいかなかったので無視。

 
また、

・サブクエリをJOIN系をなるべく使わずにWITH句に入れるパターン

・逆にWITH句を使わずにJOINさせるパターン

考えつく両方を試してみた。

結論、BigQuery上の総消費リソースは改善しないために、あまり意味はないらしい。

 
他にも良い方法があるのかもしれないが、あくまで業務優先ということで中間テーブル作成に逃げた。

 

 - データ分析