以成本為基礎的最佳化工具

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 一行表示此運算子會產生大約 2M 個數據列,而且沒有可用的統計資料。

良好估計良好

之類的 rows output: 2,451,005 est: 1616404 (1X) 線條表示此運算子會產生大約 2M 列,而估計值大約為 1.6M,而估計誤差因數為 1。

不正確的估計錯誤的估計

之類的 rows output: 2,451,005 est: 2626656323 線條表示此運算子會產生大約 2M 的資料列,而估計為 2B 個數據列,因此估計誤差因數為 1000。

停用Cost-Based優化器

預設會啟用 CBO。 您可以變更 旗標來 spark.sql.cbo.enabled 停用 CBO。

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