跳转至

Projection 优化最佳实践

原文:Best Practices for Projection Optimization

概述

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_STORAGE
  • DISK_STORAGE
  • COLUMN_STORAGE

2. 逻辑排序顺序

选择合适的逻辑排序顺序可以最大化查询性能。

  • 如果查询包含 GROUP BY 子句、JOIN 或其他谓词,应将这些列放在排序顺序的前面
  • 如果没有特定的排序标准,先按低基数(distinct 值最少)列排序,再按高基数列排序
  • 优先排低基数列还能减少磁盘空间,因为该列会被更高效地压缩

详见 Choosing Sort Order: Best Practices

3. 分段(Segmentation)

在大表上创建分段 projection 可以将查询执行负载分散到多个节点。分段实现以下目标:

  • 配合 K-safety > 0 确保高可用性和恢复
  • 将查询负载分散到多个节点
  • 使每个节点能针对不同查询负载进行优化

选择分段列是关键决策:

  • Hash 分段是首选方法
  • 具有大量唯一值(高基数)且数据分布偏差可接受的主键列是 Hash 分段的理想选择

详见:Segmented ProjectionsHASH

4. 编码(Encoding)

Database Designer 会为数据实现最优编码。创建 projection 时,应为列指定合适的编码以优化查询性能。合适的编码可以减少数据库存储占用并提升查询性能

详见:Encoding TypesColumn Encoding

监控 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 值。

扩展阅读