Spark SQLはコストベースオプティマイザー(CBO)を使用して効率的なクエリプランを選択します。 CBOはテーブルサイズやデータ分布などのテーブルや列統計を用いて代替プランのコストを推定し、最も低い推定コストのプランを選択します。 これは特に複数のジョインがあるクエリで重要で、悪いプランは良いプランよりも桁違い遅い場合があります。
CBOはデフォルトで有効ですが、統計に依存します。 統計が欠落しているか古くなった場合、CBOは非効率なジョインオーダーやジョイン戦略を選択することがあります。 表や列の統計を収集し、常に最新の状態に保ちましょう。 「統計の収集」を参照してください。
ベスト プラクティス
CBOが効率的なクエリプランを選ぶのを助けるために、以下の実践に従いましょう。
- マルチジョインクエリで使用されるテーブルの統計を収集します。 Unityカタログ管理のテーブルで予測最適化を使うと、統計が自動的に収集されます。 「統計の収集」を参照してください。
- マルチジョインクエリが予想より遅い場合はクエリプランを確認してください。 統計の欠落や不正確な統計はよくある原因です。 クエリ プランの検証を参照してください。
- 統計を廃止したり、CBOを無効にしたりするのは、統計が引き起こす特定の計画問題を緩和するためにのみです。 詳細は「コストベース最適化器を無効にする」を参照してください。
統計情報を収集する
CBO の利点を最大限に活用するには、"列統計" と "テーブル統計" の両方を収集することが重要です。
ANALYZE TABLE コマンドを使用して、統計を手動で収集できます。
ヒント
統計を最新の状態に保つには、テーブルへの書き込み後に ANALYZE TABLE を実行します。
ANALYZE を使用します
予測最適化は、統計を収集するためのコマンド ANALYZE Unity カタログのマネージド テーブルで自動的に実行されます。 Databricks では、データのメンテナンスを簡素化し、ストレージ コストを削減するために、すべての Unity Catalog マネージド テーブルに対して予測最適化を有効にすることをお勧めします。 詳細については、ANALYZE TABLEを参照してください。
オプティマイザー統計を削除して、オプティマイザーが統計に依存しなくなったようにすることができます。たとえば、統計によって発生する計画の問題を軽減できます。 ANALYZE TABLE… DROP STATISTICS を参照してください。
クエリプランの確認
クエリプランを確認するには、いくつかの方法があります。
EXPLAIN 命令
プランで統計が使用されているかどうかを確認するには、SQL コマンド EXPLAINを使用します。
統計情報が欠落している場合は、クエリプランが最適でないことがあります。
== Optimized Logical Plan ==
Aggregate [s_store_sk], [s_store_sk, count(1) AS count(1)L], Statistics(sizeInBytes=20.0 B, rowCount=1, hints=none)
+- Project [s_store_sk], Statistics(sizeInBytes=18.5 MB, rowCount=1.62E+6, hints=none)
+- Join Inner, (d_date_sk = ss_sold_date_sk), Statistics(sizeInBytes=30.8 MB, rowCount=1.62E+6, hints=none)
:- Project [ss_sold_date_sk, s_store_sk], Statistics(sizeInBytes=39.1 GB, rowCount=2.63E+9, hints=none)
: +- Join Inner, (s_store_sk = ss_store_sk), Statistics(sizeInBytes=48.9 GB, rowCount=2.63E+9, hints=none)
: :- Project [ss_store_sk, ss_sold_date_sk], Statistics(sizeInBytes=39.1 GB, rowCount=2.63E+9, hints=none)
: : +- Filter (isnotnull(ss_store_sk) && isnotnull(ss_sold_date_sk)), Statistics(sizeInBytes=39.1 GB, rowCount=2.63E+9, hints=none)
: : +- Relation[ss_store_sk,ss_sold_date_sk] parquet, Statistics(sizeInBytes=134.6 GB, rowCount=2.88E+9, hints=none)
: +- Project [s_store_sk], Statistics(sizeInBytes=11.7 KB, rowCount=1.00E+3, hints=none)
: +- Filter isnotnull(s_store_sk), Statistics(sizeInBytes=11.7 KB, rowCount=1.00E+3, hints=none)
: +- Relation[s_store_sk] parquet, Statistics(sizeInBytes=88.0 KB, rowCount=1.00E+3, hints=none)
+- Project [d_date_sk], Statistics(sizeInBytes=12.0 B, rowCount=1, hints=none)
+- Filter ((((isnotnull(d_year) && isnotnull(d_date)) && (d_year = 2000)) && (d_date = 2000-12-31)) && isnotnull(d_date_sk)), Statistics(sizeInBytes=38.0 B, rowCount=1, hints=none)
+- Relation[d_date_sk,d_date,d_year] parquet, Statistics(sizeInBytes=1786.7 KB, rowCount=7.30E+4, hints=none)
重要
複数の結合を持つクエリの場合、rowCount 統計は特に重要です。
rowCount が欠落している場合は、それを計算するのに十分な情報がないことを意味します (つまり、一部の必須の列に統計が含まれていません)。
Databricks Runtime 16.0 以降では、EXPLAIN コマンドの出力に、次のような、統計が欠損している統計、部分的な統計、または完全な統計が含まれる参照テーブルが一覧表示されます:
== Optimizer Statistics (table names per statistics state) ==
missing = date_dim, store
partial =
full = store_sales
Corrective actions: consider running the following command on all tables with missing or partial statistics
ANALYZE TABLE <table-name> COMPUTE STATISTICS FOR ALL COLUMNS
Spark SQL UI
[Spark SQL UI] ページを使用すると、実行された統計のプランと正確性を確認できます。
rows output: 2,451,005 est: N/A などの行は、この演算子によって約 200 万行が生成され、使用可能な統計がなかったことを示します。
rows output: 2,451,005 est: 1616404 (1X) などの行は、この演算子によって見積もりが 160 万に対し、約 200 万行が生成され、推定誤差率が 1 であることを意味します。
rows output: 2,451,005 est: 2626656323 などの行は、この演算子によって見積もりが 20 億に対し、約 200 万行が生成されたので、推定誤差率が 1000 であることを意味します。
コストベース最適化器を無効にしてください
CBO は既定で有効になっています。 CBO を無効にするには、spark.sql.cbo.enabled フラグを変更します。
spark.conf.set("spark.sql.cbo.enabled", false)