BigQuery ARRAY/STRUCT で速度3倍・コスト25%削減 --- JOINを消す「データの持ち方」最適化
BigQuery ARRAY/STRUCT で速度 3 倍・コスト 25% 削減 — JOIN を消す「データの持ち方」最適化 @yoshitake_l 氏が X で共有した、BigQuery のデータ構造変更による劇的な改善結果が注目を集めています。 BigQuery でデータの持ち方を変えるだけで、クエリ処理速度を 3 倍に、クエリコストを 25% 削減できたので共有。試したクエリは、1:N の 2 つのテーブルの N 側を集計し、1 側と JOIN するシンプルなもの。使ったのは、ARRAY と STRUCT というデータ構造です。 「データの持ち方を変えるだけ」で速度 3 倍・コスト 25% 削減。SQL のチューニングではなく、テーブル設計の変更でこの結果を得ています。本記事では、なぜ ARRAY/STRUCT が JOIN より高速でコストが低いのか、その技術的な仕組みと実践方法を解説します。 なぜ JOIN は遅くて高いのか BigQuery の分散処理とシャッフル BigQuery の課金と速度の問題を理解するには、まず分散処理の仕組みを知る必要があります。 BigQuery の JOIN 処理の流れ: 1. テーブル A を複数のスロット(ワーカーノード)に分散読み込み 2. テーブル B を複数のスロットに分散読み込み 3. JOIN キーに基づいて、データを適切なスロットに「再配置」 → これが「シャッフル」 4. 各スロットでマッチング処理を実行 5. 結果を統合 問題: ステップ 3 のシャッフルが最大のボトルネック ├── スロット間のネットワーク通信が発生 ├── 大量の中間データが移動 └── 通信待ちの間、スロットが遊休状態になる BigQuery のオンデマンド課金は「スキャンしたバイト数」に比例します。JOIN では両方のテーブルのキー列と必要列をすべてスキャンするため、スキャン量が増えます。さらに、JOIN に必要なシャッフル処理が実行時間を大幅に伸ばします。 ...