共用方式為


成本型最佳化工具

Spark SQL 可以使用以成本為基礎的優化器 (CBO) 來改善查詢計劃。 這特別適用於具有多個聯結的查詢。 若要讓這項作業能夠運作,請務必收集數據表和數據行統計數據,並使其保持最新狀態。

收集統計數據

若要取得 CBO 的完整優點,請務必同時收集 數據行統計數據數據表統計數據。 您可以使用 ANALYZE TABLE 命令手動收集統計數據。

提示

若要讓統計數據保持最新狀態,請在寫入數據表之後執行 ANALYZE TABLE

使用 ANALYZE

重要

與的 ANALYZE 預測優化處於公開預覽狀態。 其中包含寫入期間的智慧型手機統計數據收集。 使用此 表單 註冊公開預覽版。

預測優化會自動執行 ANALYZE,這是收集 Unity 目錄受控數據表上統計數據的命令。 Databricks 建議為所有 Unity 目錄受控數據表啟用預測優化,以簡化數據維護並減少記憶體成本。 請參閱 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 一行表示此運算符在估計為 2B 個數據列時會產生大約 2M 個數據列,因此估計誤差因數為 1000。

停用以成本為基礎的優化工具

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

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