成本型最佳化工具
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)