Delta 表格檔案會隨時間變得碎片化。 分段會增加檔案操作的開銷、降低壓縮效率,並可能限制讀取器的平行性。 壓縮會將許多小檔案重寫成較少且合適大小的檔案,使 Spark 能更有效率地讀取與處理資料。
指令 OPTIMIZE 是主要的壓縮操作。 它會將小檔案分組成為目標檔案大小的分區,然後將它們寫入儲存設備。
關於跨工作負載、SQL Analytics Endpoint、Power BI Direct Lake 與 Spark 的壓縮策略指引,請參見 跨工作負載資料表維護與優化。
壓縮方法
Microsoft Fabric 提供多種方法以維持 Delta 表格中最佳檔案大小:
OPTIMIZE 命令
此 OPTIMIZE 命令是壓縮 Delta 資料表的基本作業。 它會將小型檔案重寫為較大的檔案,以改善 Delta 資料表中的資料配置。
| 房產 | Description | 預設值 | 工作階段設定 |
|---|---|---|---|
| 最小檔案大小 | 小於此臨界值的檔案會分組在一起,並重寫為較大的檔案。 | 1073741824 (1g) | spark.databricks.delta.optimize.minFileSize |
| maxFileSize | 由 OPTIMIZE 命令產生的目標檔案大小。 |
1073741824 (1g) | spark.databricks.delta.optimize.maxFileSize |
OPTIMIZE 是冪등 的,但過大 minFileSize 尺寸可以增加寫入放大。 例如,設定 minFileSize 為 1 GB 時,一個 900 MB 的檔案在小幅額外寫入後可能會被重寫。 關於自動檔案大小管理的指引,請參見 自適應目標檔案大小。
OPTIMIZE 使用 Z 順序
當你使用這個 ZORDER BY 子句時, OPTIMIZE 會重寫活動檔案,讓值相近的列會共置在同一個檔案裡。 這改善了選擇性過濾器的檔案跳過。 在下列情況下使用 Z-Order:
- 您的查詢經常會同時篩選兩個或多個資料行 (例如,日期 + customer_id),以及
- 這些謂詞具有足夠的選擇性,因此跳過檔案層級會減少掃描的檔案數目。
OPTIMIZE dbo.table_name ZORDER BY (column1, column2)
OPTIMIZE 與 V-Order
VORDER 條款會使待壓縮的檔案套用 V-Order 優化。 如需 V-Order 的詳細資訊,請參閱詳細 檔。
OPTIMIZE dbo.table_name VORDER
OPTIMIZE 具有液體群集
液體叢集指定為表格選項;如需詳細資訊,請參閱 啟用 Liquid 叢集 。 啟用液體叢集時, OPTIMIZE 會執行套用叢集原則的實體重寫。
這很重要
只有在已啟用液體叢集的資料表上執行時 OPTIMIZE ,資料才會叢集化。 一般寫入作業不會叢集資料。 擁有合併策略(例如使用自動合併或手動排程最佳化作業)對於確保聚簇資料的優點(亦即改善的Delta文件跳過)至關重要。
快速優化
快速優化智慧地分析 Delta 資料表檔案,並略過不太可能大幅提升效能的壓縮操作。
快速最佳化不會在存在小檔案時盲目壓縮檔案,而是評估每個候選 bin (小檔案群組) 是否符合可設定的最佳實務壓縮目標。 「快速最佳化」只會在合併檔案可能達到最小目標大小或小檔案過多時,才會對檔案箱執行壓縮。 否則,它會略過該群組或減少壓縮的檔案數量。
快速最佳化可以根據您的壓縮期望進行微調:
| 房產 | Description | 預設值 | 工作階段設定 |
|---|---|---|---|
| minNumFiles | 如果 bin 不包含足夠的資料來產生 壓縮檔案,則需要以下數量的小型檔案存在於 bin 中以執行最佳化。 | 50 | spark.microsoft.delta.optimize.fast.minNumFiles |
| parquet係數 | 乘以最佳化環境定義檔案大小下限,以決定 bin 中必須存在的小型檔案資料量下限,才能將 bin 併入壓縮範圍。 | 1.3 | spark.microsoft.delta.optimize.fast.parquet係數 |
備註
parquetCoefficient結果是 bin 的目標大小大於最佳化內容的最小目標檔案大小。 此係數說明了合併多個小型 Parquet 檔案會產生更好的壓縮效果,因此資料比小型檔案的總和少。 可以增加此值,以更保守地調整快速最佳化跳過 bin 的頻率,或減少以允許更寬鬆的 bin 跳過。
運作方式
快速優化會在壓縮儲存格之前引入額外的檢查。 對於每個候選 bin,快速最佳化會進行評估:
- bin 中原始資料的估計數量 (小檔案大小的總和)
- 合併小型檔案是否預估會產生符合所設定最小目標大小的檔案
- bin 是否至少包含已配置的小檔案的最小數量
快速最佳化會評估每個小型檔案箱,並僅壓縮可能達到最小目標大小或超過最小檔案計數的小型檔案。 不符合這些閾值的區塊會被略過或部分壓縮處理。 略過次優存儲單元可減少不必要的重寫、降低寫入放大效應,並使 OPTIMIZE 作業更具冪等性。
備註
確切的實現可能會隨著時間的推移而發展。
快速優化可減少在 Delta 資料表生命週期中重寫的資料。 如下圖所示,快速優化跳過次佳儲存區,使OPTIMIZE工作執行得更快且冪等性增加,並且減少寫入放大。
備註
僅供說明之用,上圖假設從壓縮寫入的檔案大小是小檔案大小的總和。 它還表示parquetCoefficient為 1。
局限性
- 不適用於液體叢集和 Z 順序作業
- 快速最佳化不會修改自動壓縮的行為
檔案層級壓縮目標
若要避免根據變更壓縮最小和最大檔案大小目標重寫先前被視為壓縮 (足夠大) 的資料,可以啟用 以防止 spark.microsoft.delta.optimize.fileLevelTarget.enabled 重新壓縮已壓縮的檔案。 啟用時,如果檔案先前在壓縮時至少達到目標檔案大小的一半,則不會重新壓縮檔案。 維護檔案層級目標可減少寫入放大效應,因為縮減目標大小隨著時間而改變(例如,從自適應目標檔案大小進行評估並設定更大的目標)。 如果啟用,OPTIMIZE_TARGET_SIZE標籤會在執行 OPTIMIZE 時被新增至新檔案,或是在設定delta.targetFileSize或delta.targetFileSize.adaptive表格屬性時,於任何寫入作業中被新增。
備註
雖然預設未啟用,但 Microsoft 建議啟用 檔案層級壓縮目標 ,以限制潛在的寫入放大。
自動壓縮
自動壓縮會在每次寫入作業之後評估分割區健康情況。 當它偵測到分割區內過多的檔案碎片(小檔案過多)時,它會在提交寫入後立即觸發同步 OPTIMIZE 操作。 這種寫入器驅動的檔案維護方法是最佳的,因為壓縮只有在以程式設計方式確定有益時才會執行。
在會話層級啟用
在會話層級設定 spark.databricks.delta.autoCompact.enabled ,以啟用該 Spark 會話中新建立的資料表自動壓縮:
在桌面層級啟用
設定 table 屬性 delta.autoOptimize.autoCompact 以啟用特定表格的自動壓縮:
CREATE TABLE dbo.table_name
TBLPROPERTIES ('delta.autoOptimize.autoCompact' = 'true')
在建立資料表時,使用 DataFrameWriter 選項 delta.autoOptimize.autoCompact 啟用自動壓縮:
df.write.option('delta.autoOptimize.autoCompact', 'true').saveAsTable('dbo.table_name')
在現有資料表上啟用相同的資料表屬性:
ALTER TABLE dbo.table_name
SET TBLPROPERTIES ('delta.autoOptimize.autoCompact' = 'true')
調整自動壓實閾值
透過設定以下 Spark 會話配置來調整自動壓縮行為:
| 房產 | Description | 預設值 | 工作階段設定 |
|---|---|---|---|
| maxFileSize | 壓縮檔案的目標檔案大小上限 (以位元組為單位)。 | 134217728b (128 MB) | spark.databricks.delta.autoCompact.maxFileSize |
| 最小檔案大小 | 檔案的最小檔案大小 (以位元組為單位) 視為壓縮。 任何低於此閾值的項目都會被視為壓縮並計入 minNumFiles 閾值。 |
預設為未設定,除非您明確設定值,否則計算為maxFileSize的一半。 |
spark.databricks.delta.autoCompact.minFileSize |
| minNumFiles | 必須存在於觸發自動壓縮的臨界值以下 minFileSize 的檔案數目下限。 |
50 | spark.databricks.delta.autoCompact.minNumFiles |
在自動壓縮與排程優化之間選擇
Microsoft 建議自動壓縮作為大多數資料擷取工作負載的預設策略。 它通常優於固定排程,並降低維護 OPTIMIZE 工作的營運負擔。
如果你的延遲目標非常嚴格,將 OPTIMIZE 排程在獨立的 Spark 池中會更合適,因為自動壓縮會在寫入後同步執行。
將壓縮結合小檔案防護功能如優化寫入使用。 相關指引請參見 「優化寫入」。
Lakehouse 資料表維護
你可以從 Lakehouse Explorer 執行臨時維護作業,例如 OPTIMIZE。 更多資訊請參見 Lakehouse 表維護。
最佳做法摘要
利用這些建議來平衡寫入成本、讀取效能與維護開銷,以實現 Delta 資料表壓縮。
- 啟用自動壓縮來處理資料擷取管道,這可以透過頻繁的小量寫入(如串流或微批次)來減少手動排程的需求。
- 當你的服務層目標能容忍偶爾的寫入延遲尖峰時,請選擇性地使用自動壓縮來處理其他寫入模式。
- 在需要重寫多個分割區或套用 Z-Order 的安靜時段排程全表
OPTIMIZE。 -
啟用快速優化 以減少寫入放大並增加
OPTIMIZE冪등性。 - 啟用檔案層級壓縮目標 ,以減少隨著目標檔案大小增加而產生的不必要再壓縮。
- 在適當的攝取路徑中使用優化寫入,因為寫入前壓縮通常比寫入後壓縮成本較低。 相關指引請參見 「優化寫入」。