Projection 优化最佳实践¶
概述¶
Vertica 以优化查询执行的格式将数据存储在 projection 中。与物化视图类似,projection 将结果集存储在磁盘上,而不是每次查询时重新计算。Vertica 会自动用更新或新增的数据刷新这些结果集。
有时你需要手动刷新 projection 以确保最新数据存在。例如,在已有数据的表上新建 projection 时,该 projection 不会自动加载已有数据,必须执行刷新后才能参与查询。
刷新 projection 也会推进 AHM,缩短 AHM 与当前 epoch 之间的差距,从而减少 catalog 的内存使用。
本文涵盖:
- Vertica 如何使用 Projection
- 实用建议
- 监控 Projection 刷新
- 其他 Projection 操作
Vertica 如何使用 Projection¶
Projection 以优化查询执行的格式存储数据,类似物化视图。Projection 提供以下好处:
- 压缩和编码数据以减少存储空间
- 简化数据在集群中的分布
- 提供高可用性和恢复能力
实用建议¶
1. 磁盘空间¶
确保有足够的临时空间和磁盘空间来完成 projection 刷新。通常,磁盘空间为 projection 大小的 2–3 倍可以避免刷新问题。
其他可能影响 projection 性能的空间问题:
- TEMP 空间不足
- 表过大导致刷新时数据翻倍
如果磁盘空间不足导致刷新失败,需要执行 rollback(回滚),终止当前事务并丢弃所有变更。参见 创建与回滚事务。
监控磁盘空间相关系统表:
PROJECTION_STORAGEDISK_STORAGECOLUMN_STORAGE
2. 逻辑排序顺序¶
选择合适的逻辑排序顺序可以最大化查询性能。
- 如果查询包含
GROUP BY子句、JOIN 或其他谓词,应将这些列放在排序顺序的前面 - 如果没有特定的排序标准,先按低基数(distinct 值最少)列排序,再按高基数列排序
- 优先排低基数列还能减少磁盘空间,因为该列会被更高效地压缩
3. 分段(Segmentation)¶
在大表上创建分段 projection 可以将查询执行负载分散到多个节点。分段实现以下目标:
- 配合 K-safety > 0 确保高可用性和恢复
- 将查询负载分散到多个节点
- 使每个节点能针对不同查询负载进行优化
选择分段列是关键决策:
- Hash 分段是首选方法
- 具有大量唯一值(高基数)且数据分布偏差可接受的主键列是 Hash 分段的理想选择
4. 编码(Encoding)¶
Database Designer 会为数据实现最优编码。创建 projection 时,应为列指定合适的编码以优化查询性能。合适的编码可以减少数据库存储占用并提升查询性能。
监控 Projection¶
使用以下系统表监控 projection 状态和性能:
| 系统表 | 说明 |
|---|---|
PROJECTIONS |
列出 projection 信息 |
PROJECTION_CHECKPOINT_EPOCHS |
checkpoint epoch 刷新详情 |
PROJECTION_COLUMNS |
projection 列信息(编码类型、排序顺序、统计类型、统计最后更新时间) |
PROJECTION_DELETE_CONCERNS |
列出删除数据时可能存在性能问题的 projection |
其他 Projection 操作¶
刷新 Projection¶
当为已有数据的表创建 projection 时,Vertica 不会自动将数据加载到新 projection 中。必须手动刷新,否则新 projection 无法参与对锚表的查询执行。
- 使用
REFRESH函数执行刷新 - 使用
PROJECTION_REFRESHES系统表监控刷新状态
合并 Projection¶
良好的 projection 设计是合并准备的基础(参见 How to Create a Design)。好的设计能让查询优化器更容易选择最佳 projection 进行合并,避免额外的排序和数据传输操作,提升 MERGE 性能。
设置 Projection 的 K-Safety¶
K-safety 设置 Vertica 数据库集群的容错能力。K 值代表集群中数据的副本数量,这些副本允许其他节点接管故障节点的查询处理。
在 projection 中实现 K-Safety 取决于使用分段还是非分段 projection:
- 分段 projection(K-safe 数据库): Vertica 为该 projection 创建多个 buddy,分布到集群中不同节点
- 非分段 projection(如维度表): 由于相对较小,可以在不分段的情况下将所有集群节点上的 projection 复制
在创建 projection 时设置 K-Safety 值。
扩展阅读¶
- Vertica 性能调优 - 3 重新设计 PROJECTION — Projection 设计优化详解
- Vertica 性能调优 - 1 如何阅读执行计划 — 执行计划与 Projection 选择
- K-Safety 最佳实践 — Projection 的 K-Safety 配置
- Vertica 资源池配置的最佳实践 — 资源池对 Projection 刷新的影响