Z 順序是一種資料佈局技術,透過在一個或多個欄位上應用 Z 順序(Morton)填充空間曲線,將相關資料置於同一檔案中。 此技術會縮小儲存在檔案層級統計資料中的最小值/最大值範圍,從而在查詢以這些欄位作為篩選條件時,改善 略過檔案 的效果。
Tip
對於大多數從 Fabric Runtime 2.0 開始的工作負載,推薦的資料配置策略是liquid 叢集。 它提供靈活的欄位選擇、增量優化,即使是高基數欄位,也不會帶來小檔案問題。 只有在你有較舊的執行環境已有既定工作流程,或不需要液態叢集的彈性時,才使用 Z-Order。
完整的液體聚類指引,請參見 液態聚類。
何時使用 Z 順序
在下列情況下使用 Z-Order:
- 你使用的是 Fabric Runtime 1.2 或更早版本,液態叢集功能尚未普及或支援有限。
- 你已經有一套既定的 Z 順序工作流程,不需要頻繁更換欄位。
- 你想要多欄檔案跳過,但不引入分割。
套用 Z 順序
Z-Order 會作為 OPTIMIZE 命令的一部分套用。 與液態叢集不同,每次執行時,你都會直接在語句中 OPTIMIZE 指定欄位——欄位不會儲存在資料表中繼資料中。
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+ 中為增量) |