注意
在 Databricks Runtime 13.3 及更高版本中,Databricks 建议对表布局使用液体聚类分析。 群集与 Z 排序不兼容。 请参阅 对表使用液体聚类分析。
将数据写入表中时,会自动收集跳过数据的信息。 Azure Databricks 利用此信息(查询时每个文件的最小值和最大值、null 计数和总记录数),以提供更快的查询。
你必须为 ZORDER 语句中使用的列收集统计信息。 请参阅什么是 Z 排序?
指定统计信息列
对于 Unity 目录 外部表,统计信息默认收集在表架构中定义的前 32 列。 对于 Unity Catalog 托管表,智能地使用预测优化进行文件跳过统计信息的选择,并且没有 32 列的限制。
如果不使用预测优化,可以通过设置下表属性之一来修改将统计信息集合限制为 32 列的行为:
| 表属性 | 支持的 Databricks Runtime | 说明 |
|---|---|---|
dataSkippingNumIndexedCols |
所有支持的 Databricks Runtime 版本 | 增加或减少收集统计信息的列数。 取决于列顺序。 |
dataSkippingStatsColumns |
Databricks Runtime 13.3 LTS 及更高版本 | 指定为其收集统计信息的列名的列表。 取代了 dataSkippingNumIndexedCols。 |
可以在创建表时或使用 ALTER TABLE 语句设置表属性。 请参阅 表属性参考。 下面的示例修改了默认的统计信息收集行为,以便在指定的列上收集统计信息:
-- For Delta tables
ALTER TABLE table_name SET TBLPROPERTIES('delta.dataSkippingStatsColumns' = 'col1, col2, col3')
-- For Iceberg tables
ALTER TABLE table_name SET TBLPROPERTIES('iceberg.dataSkippingStatsColumns' = 'col1, col2, col3')
更新这些属性不会自动重新计算现有数据的统计信息。 相反,在表中添加或更新数据时,它会影响将来的统计信息收集行为。 统计信息不用于当前统计信息列列表中不包含的列。
在 Databricks Runtime 14.3 LTS 及更高版本中,如果更改表属性或更改用于统计信息的指定列,则可以手动使用以下命令重新计算表的统计信息:
ANALYZE TABLE table_name COMPUTE DELTA STATISTICS
注意
在统计信息收集期间会截断长字符串。 可以选择从统计信息集合中排除长字符串列,尤其是在这些列不经常用于筛选查询时。
什么是 Z 排序?
注意
Databricks 建议对所有新表使用液体聚类分析。 不能将 ZORDER 与 Liquid 聚类分析结合使用。 请参阅 对表使用液体聚类分析。
Z 排序是并置同一组文件中的相关信息的方法。 Azure Databricks 数据跳过算法会自动使用此共同区域。 此行为可减少需要读取的数据量。 要对数据进行 Z 顺序排序,请在 ZORDER BY 子句中指定排序的列:
OPTIMIZE events
WHERE date >= current_timestamp() - INTERVAL 1 day
ZORDER BY (eventType)
如果希望在查询谓词中常规使用某一列,并且该列具有较高的基数(即包含多个非重复值),请使用 ZORDER BY。
可以将 ZORDER BY 的多个列指定为以逗号分隔的列表。 但是,区域的有效性会随每个附加列一起删除。 Z 排序对于未收集统计信息的列无效,并且会浪费资源。 这是因为跳过数据需要列本地统计信息,例如最小值、最大值和计数。 可通过对架构中的列重新排序来对某些列配置统计信息收集,也可增加从中收集统计信息的列数。
注意
Z 排序不是幂等的,而应该是增量操作。 多次运行不能保证 Z 排序所需的时间减少。 但是,如果没有将新数据添加到刚刚进行 Z 排序的分区,则该分区的另一个 Z 排序将不会产生任何效果。
Z 排序旨在根据元组的数量生成均匀平衡的数据文件,但不一定是磁盘上的数据大小。 这两个度量值通常是相关的,但可能会有例外的情况,导致优化任务时间出现偏差。
例如,如果
ZORDER BY日期,并且最新记录的宽度比过去多很多(例如数组或字符串值较长),则OPTIMIZE作业的任务持续时间和所生成文件的大小都会出现偏差。 但这只是OPTIMIZE命令本身的问题;它不应对后续查询产生任何负面影响。