Z-Order 是一种数据布局技术,它通过对一个或多个列应用 Z-Order(Morton)空间填充曲线,将相关数据共同存放在同一文件中。 该技术会缩小存储在文件级统计信息中的最小值和最大值的取值范围,从而在查询按这些列进行筛选时改善 文件跳过 效果。
小窍门
对于从 Fabric Runtime 2.0 开始的大多数工作负荷,quid 群集是建议的数据布局策略。 它支持灵活的列选择、增量优化,并且不会因高基数列而产生小文件问题带来的性能损耗。 仅当您在较旧运行时上已有既定工作流,或者不需要液态聚类的灵活性时,才使用 Z-Order。
有关液态聚类的完整指南,请参阅 液态聚类。
何时使用 Z-Order
在以下情况下使用 Z 顺序:
- 你当前使用的是 Fabric Runtime 1.2 或更早版本,在该版本中,liquid clustering 不可用或仅提供有限支持。
- 你已建立 Z 顺序工作流,无需频繁更改列。
- 你希望在不引入分区机制的情况下实现多列文件跳过。
应用 Z 顺序
Z-Order 作为 OPTIMIZE 命令的一部分应用。 与液体聚类分析不同,每次运行时,直接在 OPTIMIZE 语句中指定列 - 这些列不会存储在表元数据中。
小窍门
从 Fabric Runtime 2.0 开始,Native 执行引擎支持使用指定的 OPTIMIZE 执行 ZORDER,从而提供 30-50% 更快的多维聚类分析性能。 以前的运行时回退到常规的非加速 Spark 执行。
使用 WHERE 谓词限定 Z-Order 的范围
可以添加一个 WHERE 子句来限制哪些文件 OPTIMIZE ZORDER BY 重写。 只有包含与谓词匹配的行的文件,才会作为压缩和 Z-Order 布局的候选对象。 该 WHERE 子句可用于增量维护,例如,在引入运行后仅对最新数据进行 Z 排序。
-- 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 顺序和液体聚类分析在同一表中 不兼容 。 使用一个或另一个。
- 为获得最佳结果,请选择经常出现在子句中的
WHERE1 到 4 列。
比较 Z 顺序和液体聚类分析
| 方面 | Z-Order | 液体聚类分析 |
|---|---|---|
| 列更改 | 必须对每个 OPTIMIZE 重新指定 |
ALTER TABLE CLUSTER BY 持久化定义 |
| 增量模式 | 否。 每次运行都完全重写 | 是(运行时 2.0+) |
| 列式存储 | 未在元数据中持久化 | 存储在表元数据中 |
| 曲线算法 | Z 顺序曲线 | Z 顺序(一列)、希尔伯特(2 列以上) |
| 运行时要求 | 所有运行时 | 运行时 1.2+ (增量为 2.0+) |