轻量级更新
轻量级更新
当轻量级更新启用时,更新的行会立即标记为已更新,后续的 SELECT
查询将自动返回已更改的值。当轻量级更新未启用时,您可能需要等待后台进程应用您的变更才能看到已更改的值。
可以通过启用查询级设置 apply_mutations_on_fly
来为 MergeTree
系列表启用轻量级更新。
示例
让我们创建一个表并执行一些变更:
让我们通过 SELECT
查询检查更新的结果:
请注意,当我们查询新表时,行的值尚未更新:
现在让我们看看启用轻量级更新后会发生什么:
SELECT
查询现在立即返回正确的结果,无需等待变更应用:
性能影响
当轻量级更新启用时,变更不会立即物化,而只会在 SELECT
查询期间应用。然而,请注意,变更仍会在后台异步物化,这是一项耗时的过程。
如果提交的变更数量持续超过在一定时间间隔内处理的变更数量,未物化的变更队列将不断增长。这将导致 SELECT
查询性能最终下降。
我们建议启用设置 apply_mutations_on_fly
,同时结合其他 MergeTree
级别的设置,例如 number_of_mutations_to_throw
和 number_of_mutations_to_delay
,以限制未物化变更的无限增长。
对子查询和非确定性函数的支持
轻量级更新对子查询和非确定性函数的支持有限。仅支持结果大小合理的标量子查询(由设置 mutations_max_literal_size_to_replace
控制)。仅支持常量非确定性函数(例如,函数 now()
)。
这些行为由以下设置控制:
mutations_execute_nondeterministic_on_initiator
- 如果为 true,非确定性函数在发起副本上执行,并在UPDATE
和DELETE
查询中作为字面量替换。默认值:false
。mutations_execute_subqueries_on_initiator
- 如果为 true,标量子查询在发起副本上执行,并在UPDATE
和DELETE
查询中作为字面量替换。默认值:false
。mutations_max_literal_size_to_replace
- 要在UPDATE
和DELETE
查询中替换的序列化字面量的最大字节大小。默认值:16384
(16 KiB)。