本文档重点介绍 Vertica 中的 Replay Delete 、如何设计投影以及配置 Vertica 数据库以提高 Replay Delete 性能。
1、什么是 Replay Delete ?
由于在 Tuple Mover 、恢复、刷新和数据 Rebalance 这些操作中都会重组部分或全部的存储容器,因此已删除数据的位置可能会在新创建的存储容器中发生变化。
在 Vertica 中,删除向量(Delete Vector)记录着存储容器中已删除数据的位置,以及删除数据的语句提交时的 Epoch。重建删除向量以适应跨存储容器的记录移动的过程称为 Replay Delete。
Vertica 有两种执行 Replay Delete 操作的算法。
2、传统算法
传统的 Replay Delete 算法首先尝试通过匹配 Projection 排序顺序中的列来找到已删除记录在新存储容器中的位置。如果该算法找到唯一匹配,则将其记录在删除向量中。如果算法未找到唯一匹配,则匹配所有投影列。
当投影排序顺序中只有几列并且这些列可以唯一标识已删除的行时,此 Replay Delete 算法非常有效。但是,当投影排序顺序中的列基数较低并且无法唯一标识已删除的行时,该算法的性能不佳。该算法的时间复杂度为O(N^2)。
3、新算法
由于传统算法仅适用于包含一些具有唯一标识符的列的数据集,因此它并不总是最佳选择。
新的 Replay Delete 算法将标记为删除的数据和存储容器中的数据进行关联。Projection 所有的列都用作关联键。
系统会记录每个输入到关联操作的记录(数据行)的具体位置。当这些记录符合关联条件时,系统会利用这些匹配记录的位置信息来构建“删除向量”。
带有关联操作的新 Replay Delete 算法的时间复杂度为 O(NlogN)。
4、Vertica 如何使用算法?
这两种 Replay Delete 算法各有其优点。算法性能取决于以下因素:投影设计、行数以及要 Replay Delete 的记录数量。
- 当投影在排序顺序中具有高基数并且删除记录的百分比较低时,传统的重播删除算法表现最佳。
- 当投影排序顺序具有低基数时,新的重播删除算法比传统算法表现更好。
由于这两种算法都不是适用于每个数据集的理想解决方案,并且由于两种算法根据投影设计的性能不同,因此 Vertica 会同时使用这两种算法。当开始 Replay Delete 操作时,Vertica 首先使用传统的 Replay Delete 算法。当传统的 Replay Delete 算法达到时间复杂度O(N^2)时,Vertica使用新算法重新规划 Replay Delete 任务。
5、优化 Projection 设计
为了提高 Replay Delete 性能,Vertica 建议投影的投影排序顺序中至少应有一个高基数列。高基数列在投影排序顺序中的位置并不重要,它可以是最后一列。
6、Replay Delete 的数据库相关参数设置
ReplayDeleteAlgorithmSwitchThreshold 是 Vertica 在使用传统算法进行 Replay Delete 过程中决定是否需要切换为新算法的阈值配置参数。如果达到了该阈值 ,Vertica 使用新的算法重试。
select * from configuration_parameters where parameter_name ilike '%ReplayDeleteAlgorithmSwitchThreshold%';
-[ RECORD 1 ]-----------------+-------------------------------------------------------------------------------------------------
node_name | ALL
parameter_name | ReplayDeleteAlgorithmSwitchThreshold
current_value | 10
restart_value | 10
database_value | 10
default_value | 10
current_level | DEFAULT
restart_level | DEFAULT
is_mismatch | f
groups |
allowed_levels | NODE, DATABASE
superuser_visible_only | f
change_under_support_guidance | t
change_requires_restart | f
description | Switch Replay Delete to use the new algorithm once runtime scan statistics exceeds the threshold
此参数的默认值为 10。如果将此值更改为 0,Vertica 将不会使用传统的 Replay Delete 算法。
- 如果数据库所有的 Projection 都针对 Replay Delete 进行了优化,并且表中标记为已删除的行的百分比较低,则保持
ReplayDeleteAlgorithmSwitchThreshold参数为默认值 10。 - 如果您的数据库尚有未针对 Replay Delete 进行优化的投影,并且大型表的已删除记录百分比较高,则可以将
ReplayDeleteAlgorithmSwitchThreshold参数设置为值 0 或 1:- 通过将此参数设置为 1,可以降低传统 Replay Delete 算法使用的阈值;针对 Replay Delete 进行优化的投影将使用传统算法成功,而其他投影将更快地转移到新的连接算法。
- 通过将此参数设置为 0,Vertica 使用新的 Replay Delete 算法,并且在大多数情况下可以节省时间,特别是没有针对 Replay Delete 优化的投影。





