この記事はラクスパートナーズ Advent Calendar 2023の20日目の記事です。
はじめに
少し奇抜な見出しから始まる本記事は、BigQueryでのクエリ高速化に取り組んだ実体験から学んだことをまとめるものになります。しかし、ただまとめるだけでは味気ないので、とあるモンスターを狩るゲーム風にして書いてくというのがコンセプトになります。簡単に設定の整理をしておきます。
- 課題:BQクエリの高速化=モンスターを狩る
- 問題:どのコードがボトルネックで、それはどこにあるのか=モンスターは何で、どこに生息しているのか
- 方法:ボトルネックとなるコードを修正する方法=モンスターを倒す方法
最初に取り組んだこと
村長からモンスターを狩るように依頼を受け、どんなモンスタ-がきてもいいように装備を整えることから始めました。
とりあえず倒す装備を整える
クエリの高速化に関する知識を書籍やネットを通じて調べて知識を蓄えていきました。
- SELECT * を避ける(必要なカラムを指定する)
- クロス結合の回避
- 集合関数の代わりにウィンドウ関数を検討
- etc...
この知識を適用できる箇所を探せばなにかしらできるだろう!と思っていました。すなわち、「ある程度の武器と防具があれば、どんなモンスターでも倒せるだろう!」と装備を整えたのです。モンスターには強みや弱点があり、それによって装備を変えなければならないという基本も忘れ、ましてやモンスターの位置も正体すらもわからないままに。。。😇
いきなり荒野に飛び出す
次に、知識というの名の装備を整え(たと勘違い)、クエリという名の荒野にいきなり飛び込んで上から下まで読みました。そこで気づくのです。あ、あれ、モンスターどこにいるの?。。。というかどのモンスターを退治すればいいの??と。
以下はクエリの概要です。
CREATE XXX TABLE AS
WITH XXX AS (
...
)
SELECT
A,
B,
...
FROM C
INNER JOIN D
LEFT JOIN E
LEFT JOIN F
...
このクエリは、必要なカラムのみが記載され、クロス結合も、集合関数もありませんでした。。。
装備を整えたところで倒すべき相手が何でどこにいるかすらもわからないのです。
実行グラフと出会う
諦めて村へ帰り、村長に「なんの成果もありませんでした!」と報告しようとした時に、実行グラフという地図を見つけました。
実行グラフ
参考: クエリ実行グラフを使用した BigQuery 分析クエリのトラブルシューティングと最適化
実行グラフとは、クエリの各ステージを視覚的に分割し、処理の流れや指標を示してれるものです。簡単にいうと目でクエリ実行の流れが追える人間にありがたいツールです。(こちらにより詳しい記事を書いてくださっている方がいらっしゃいます。参考:BigQueryの「実行グラフ」をさわってみた)
そこで元のクエリを動作させ、実行グラフとを確認したところ、コードを目で追うだけではわからなかったボトルネックが簡単に発見できました。それが以下の部分です。
FROM C
INNER JOIN D
...
なんてことない内部結合がこのクエリの大半の実行時間とコストを消費していたのです。さらに調査すると、Cテーブルが巨大なまま使用されていることが原因だとわかりました。ここにきて、ついにモンスターとその居場所を突き止めたのです。(←最初にやれ)
モンスター討伐!
さて、後は正体がわかったCテーブルというモンスターを討伐するだけになりました。(だけ、と言いつつもこの後も戦闘は続いていくのですが、それはまた別のお話。。。)
結果として、BQのスロット時間を従来からおよそ1/7程度にすることができました!
振り返り
Bigqueryの実行グラフを紹介するという記事を書くつもりでいましたが、他にも学べたことがあるので振り返っておきたいと思っています。
1 . 原因が何かを把握する
- コードを読むことももちろん重要ですが、実際に動かして、どこが原因か検討をつけるということが大切だと痛感しました。
2 . 原因がわかったら、適した解決策を考える
- 今回は解決策を調べて原因を探すという真逆のことを行いましたが、これでは知っている方法以外の原因=なにもできなくなるということになります。原因がなにかをわからないと路頭に迷います。。
3 .BQで原因の特定に一役買ってくれるのが「実行グラフ」!ぜひ皆様も活用してみてください!
この記事が、少しでもお役に立てれば幸いです。読んでいただきありがとうございました!