Delta 表格的 Z 順序

Z 順序是一種資料佈局技術,透過在一個或多個欄位上應用 Z 順序(Morton)填充空間曲線,將相關資料置於同一檔案中。 此技術會縮小儲存在檔案層級統計資料中的最小值/最大值範圍,從而在查詢以這些欄位作為篩選條件時,改善 略過檔案 的效果。

Tip

對於大多數從 Fabric Runtime 2.0 開始的工作負載,推薦的資料配置策略是liquid 叢集。 它提供靈活的欄位選擇、增量優化,即使是高基數欄位,也不會帶來小檔案問題。 只有在你有較舊的執行環境已有既定工作流程,或不需要液態叢集的彈性時,才使用 Z-Order。

完整的液體聚類指引,請參見 液態聚類。

何時使用 Z 順序

在下列情況下使用 Z-Order:

  • 你使用的是 Fabric Runtime 1.2 或更早版本,液態叢集功能尚未普及或支援有限。
  • 你已經有一套既定的 Z 順序工作流程,不需要頻繁更換欄位。
  • 你想要多欄檔案跳過,但不引入分割。

套用 Z 順序

Z-Order 會作為 OPTIMIZE 命令的一部分套用。 與液態叢集不同,每次執行時,你都會直接在語句中 OPTIMIZE 指定欄位——欄位不會儲存在資料表中繼資料中。

OPTIMIZE sales ZORDER BY (order_date, region)

Tip

從 Fabric Runtime 2.0 開始,Native 執行引擎支援在指定 OPTIMIZE 的情況下執行 ZORDER,使多維叢集效能提升 30–50%。 較早版本的執行階段會回退為一般的非加速 Spark 執行模式。

使用 WHERE 謂詞限定 Z 順序

你可以加一個 WHERE 條款來限制哪些檔案 OPTIMIZE ZORDER BY 可以重寫。 只有包含與謂詞相符的列的檔案才是壓縮與 Z 階佈局的候選。 WHERE 子句適用於增量維護,例如在資料擷取作業完成後,僅對最新資料進行 Z-Ordering。

-- Z-Order only files that contain data from the last 7 days
OPTIMIZE sales
WHERE order_date >= current_date() - INTERVAL 7 DAYS
ZORDER BY (order_date, region)

使用 WHERE 謂詞可減少重寫資料量,降低計算成本與執行時間。 述詞會根據檔案層級的統計資料進行篩選,因此對於每個檔案中最小值/最大值範圍已較集中的欄位,效果最佳(例如依時間先後順序寫入的日期欄位)。

帶有分割的 Z 階

Z-Order 和分區可以結合使用。 當兩者同時使用時,則 OPTIMIZE ZORDER BY 會在每個分割區內獨立套用 Z 順序佈局。 當你需要透過分區來實現 並行寫入器隔離,並利用 Z-Order 在其他欄位上略過檔案時,這種組合就非常有用。

-- Table is partitioned by region; Z-Order by order_date within each partition
OPTIMIZE sales ZORDER BY (order_date)

重要考慮

  • Z 順序欄位不會儲存在表格的元資料中。 你每次執行 OPTIMIZE都必須指定它們。
  • Z-Order 每次執行都會重寫所有符合資格的檔案 OPTIMIZE ,除非你提供 WHERE 條件限制範圍。 沒有像液體聚類那樣的增量模式。
  • Z 階與液體聚類在同一張表 上不相容 。 只能用其中一種。
  • 為了達到最佳效果,請選擇 1 到 4 個經常出現在 WHERE 子句中的欄位。

比較 Z 階與液體聚類

Aspect Z序列 液體叢集
列數變動 必須在每個 OPTIMIZE 上重新指定 ALTER TABLE CLUSTER BY 持續定義
增量模式 No. 每次執行時完整重寫 是(執行時間 2.0+)
欄式儲存 未持續存在於元資料中 儲存於資料表中繼資料中
曲線演算法 Z階曲線 Z 階(一欄)、希爾伯特階(2+欄)
執行時間需求 所有播出時間 Runtime 1.2+(2.0+ 中為增量)