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

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

統計情報の収集

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

ヒント

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

クエリプランの確認

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

EXPLAIN コマンド

プランで統計が使用されているかどうかを確認するには、SQL のコマンドを使用します

  • Databricks Runtime 7.x 以降: 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 が欠落している場合は、それを計算するのに十分な情報がないことを意味します (つまり、一部の必須の列に統計が含まれていません)。

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)