查詢緩慢且計算成本高,通常來自幾個根本原因:讀取超過查詢所需資料、在節點間重新調整資料、選擇不佳的查詢計畫,或重寫未改變的檔案。 Azure Databricks 自動處理許多這些成因,涵蓋從大規模 ETL 處理到臨時、互動式查詢等工作負載。 其他優化只會在你開啟或針對特定工作負載調整時才適用。
這個頁面從大多數工作負載的建議開始,接著依照優化是自動執行還是需要你設定來分組,並說明每項優化所解決的問題。 大多數 Databricks 執行時優化需要 Delta Lake,這是 Azure Databricks 表格的預設格式。
從這些建議開始
這些選擇能為大多數工作負載帶來最大的效能提升。 它們也幫助本頁的許多自動優化功能發揮最大效力。
-
使用 Liquid clustering 來進行表格佈局。Liquid clustering 取代了表格分割和
ZORDER。 它會依照你經常篩選的欄位組織資料,改善 資料略過 和動態檔案修剪。 - 使用 Unity Catalog 管理的資料表。預測優化 會自動維護受管理的資料表。 請參閱 Unity Catalog 管理的 Delta Lake 與 Apache Iceberg 表格。
- 使用啟用 Photon 的運算。 Predictive I/O 需要 Photon,而
MERGE、UPDATE和DELETE語句中的動態檔案剪枝也需要 Photon。 請參閱 什麼是 Photon?。 - 啟用刪除向量。 Predictive I/O 使用刪除向量以避免在更新、刪除與合併期間重寫整個檔案,而列層級的並行處理則需要這些向量。 對於 Delta Lake 表格,你必須明確啟用刪除向量。 請參見 Databricks 中的刪除向量。
- 使用最新的 Databricks 執行環境。 新版本包含最新的效能提升。 部分最佳化至少需要 Databricks Runtime 的最低版本,或啟用 Photon 的運算資源。 請參閱各頁了解需求。
自動優化
這些優化預設是開啟的。 你不一定要啟用它們,但有些功能在你的資料表和運算符合特定條件時,會帶來更多好處,例如使用 Photon 或讓資料表統計資訊保持最新。
- 磁碟快取:加速重複讀取相同遠端 Parquet 與 Delta Lake 資料檔案的查詢。 Azure Databricks 會將檔案副本快取到運算節點的本地儲存,讓後續的讀取能在本地執行。 Azure Databricks 會自動在支援此功能的工作者實例類型上啟用此功能。
-
動態檔案修剪:跳過在 Delta Lake 資料表上執行聯結時無法包含相符列的檔案。
MERGE、UPDATE,以及DELETE這些語句需要啟用 Photon 的計算來進行動態檔案剪枝。 -
低洗牌合併:加速
MERGE在每個檔案中更新或刪除少數資料列的作業。 低洗牌合併處理未修改的列,無需洗牌,並保留其現有的資料配置。 - 自適應查詢執行:根據資料的實際大小,在查詢執行時重新優化查詢計畫。 這修正了緩慢的聯結策略、過多的小任務,以及因估算不準確而產生的分配不均的任務。
- Predictive I/O:加速資料掃描,並減少在啟用 Photon 的運算資源上進行更新、刪除及合併時重寫的資料量。
- 成本基礎優化器:利用表格與欄位統計選擇高效的查詢計畫,特別是針對多重連接的查詢。 成本基礎優化器依賴統計數據,因此收集統計數據並保持其最新。
-
預測優化:在 Unity Catalog 管理的資料表上自動執行
OPTIMIZE、VACUUM和ANALYZE,因此你不需要排程維護資料表。 同時也能保持成本基礎優化器所使用的統計數據最新。 要確認你的帳戶是否啟用預測優化,請參考 驗證是否啟用預測優化。
您設定的最佳化項目
這些優化需要你開啟它們、調整它們或更改表格配置。 當工作負載需要預設無法涵蓋的行為時,會使用它們。
- 歸檔支援:當雲端生命週期政策將舊資料表檔案移至歸檔儲存層時使用,以降低儲存成本。 封存支援會告訴 Azure Databricks 忽略超過指定期間的檔案,這樣生命週期原則就不會破壞只讀取近期資料的查詢。 這項功能處於公開預覽狀態。
- 範圍聯結:當聯結使用點落在區間內或區間重疊條件時使用。 Databricks SQL 會自動優化範圍聯結。 在其他運算資源上,則會透過連接提示或會話設定來調整範圍連接。
- 隔離層級與寫入衝突:當同時寫入同一資料表時發生衝突,或工作負載需要比預設 WriteSerializable 隔離層級更嚴格的保證時,使用此方法。 可序列化的隔離 會降低並行寫入的吞吐量。 列層級並行能自動解決符合其要求的資料表上並行寫入的多數衝突。
-
全文搜尋索引:當查詢使用
search或isearch函數在文字欄位中搜尋子字串或單字時使用。 建立索引時會跳過無法包含相符列的檔案。 此功能目前仍處於測試階段。
注意
布隆過濾器索引是已不再使用的資料跳過功能。 它們會增加寫入負擔,且難以調校。 如果你的資料表有這些索引,請參考 Bloom filter indexes(已棄用) 來替換和移除它們。
其他效能功能
- 高階函數 具有內建且最佳化的效能,適用於許多沒有常見 Spark 運算子的操作。 高階函數的表現優於使用者自訂函數。
- Azure Databricks 內建運算子與特殊語法,用於處理複雜資料型態,包括陣列、結構體與 JSON 字串。
- Spark SQL 查詢 JSON 字串 時不會先解析它們。
- 要控制寫入產生的資料檔案大小,請參見 控制資料檔案大小。
- 關於資料表設計與維護指引,請參見 最佳實務:Delta Lake。
診斷緩慢或成本高昂的工作負載
如果工作負載比預期慢或成本高,且你不知道原因,請先用 Spark UI 找出瓶頸,再決定是否更改設定。 請參考 使用 Spark UI 診斷成本與效能問題。