メインコンテンツまでスキップ

コストベースのオプティマイザー

Spark SQL では、コストベースのオプティマイザー (CBO) を使用してクエリ プランを改善できます。 これは、複数のジョインを持つクエリに特に便利です。これを機能させるには、テーブルと列の統計を収集し、それらを最新の状態に保つことが重要です。

統計の収集

CBO を最大限に活用するには、 列統計テーブル統計 の両方を収集することが重要です。 ANALYZE TABLE コマンドを使用して、統計を手動で収集できます。

ヒント

統計を最新の状態に保つには、テーブルへの書き込み後に ANALYZE TABLE を実行します。

使う ANALYZE

予測的最適化 統計を収集するためのコマンドである ANALYZE を Unity Catalog マネージドテーブルで自動的に実行します。 Databricks では、すべての Unity Catalog マネージドテーブルに対して予測的最適化を有効にして、データのメンテナンスを簡素化し、ストレージ コストを削減することをお勧めします。 ANALYZE TABLEを参照してください。

クエリ プランを確認する

クエリ プランを確認するには、いくつかの方法があります。

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)
important

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 のような行は、この演算子が約 2M 行を生成し、使用可能な統計がなかったことを意味します。

良い見積もり

rows output: 2,451,005 est: 1616404 (1X) のような行は、このオペレーターがおよそ生産していることを意味します。 200万行、推定値は約 160万で、推定誤差係数は1でした。

悪い見積もり

rows output: 2,451,005 est: 2626656323 のような行は、この演算子が約 2M 行を生成するのに対し、推定値は 2B 行であるため、推定誤差係数は 1000 であることを意味します。

コストベースのオプティマイザーの無効化

CBO はデフォルトで有効になっています。 CBO を無効にするには、 spark.sql.cbo.enabled フラグを変更します。

Scala
spark.conf.set("spark.sql.cbo.enabled", false)