跳到主要内容
跳到主要内容

轻量级更新

轻量级更新

当启用轻量级更新时,更新的行会立即标记为已更新,随后的 SELECT 查询将自动返回更改的值。当未启用轻量级更新时,您可能需要等待后台进程应用您的变更才能看到更改的值。

通过启用查询级设置 apply_mutations_on_fly,可以为 MergeTree 家族表启用轻量级更新。

示例

让我们创建一个表并运行一些变更:

让我们通过 SELECT 查询检查更新的结果:

请注意,当我们查询新表时,行的值尚未更新:

现在,让我们看看启用轻量级更新时会发生什么:

SELECT 查询现在立即返回正确的结果,而无需等待变更的应用:

性能影响

当启用轻量级更新时,变更不会立即物化,而只会在 SELECT 查询期间应用。然而,请注意,变更仍会在后台异步物化,这是一个重型过程。

如果提交的变更数量持续超过在某个时间间隔内在后台处理的变更数量,则必须应用的未物化变更的队列将不断增长。这将导致 SELECT 查询性能最终下降。

我们建议启用 apply_mutations_on_fly 设置,并结合其他 MergeTree 级设置,例如 number_of_mutations_to_thrownumber_of_mutations_to_delay,以限制未物化变更的无限增长。

对子查询和非确定性函数的支持

轻量级更新对子查询和非确定性函数的支持有限。仅支持结果合理大小的标量子查询(由设置 mutations_max_literal_size_to_replace 控制)。仅支持常量非确定性函数(例如函数 now())。

这些行为由以下设置控制:

  • mutations_execute_nondeterministic_on_initiator - 如果为 true,非确定性函数将在发起副本上执行,并在 UPDATEDELETE 查询中替换为字面量。默认值:false
  • mutations_execute_subqueries_on_initiator - 如果为 true,标量子查询将在发起副本上执行,并在 UPDATEDELETE 查询中替换为字面量。默认值:false
  • mutations_max_literal_size_to_replace - 在 UPDATEDELETE 查询中替换的字面量的最大序列化大小(以字节为单位)。默认值:16384(16 KiB)。