轻量级更新
轻量级更新
note
轻量级更新仅在ClickHouse Cloud中可用。
当启用轻量级更新时,更新的行将立即标记为已更新,并且后续的 SELECT
查询将自动返回更改后的值。当未启用轻量级更新时,您可能需要等待突变通过后台进程应用以查看更改后的值。
可以通过启用查询级别设置 apply_mutations_on_fly
来为 MergeTree
类型的表启用轻量级更新。
SET apply_mutations_on_fly = 1;
示例
让我们创建一个表并运行一些突变:
CREATE TABLE test_on_fly_mutations (id UInt64, v String)
ENGINE = MergeTree ORDER BY id;
-- 禁用突变的后台材料化,以展示未启用轻量级更新时的默认行为
SYSTEM STOP MERGES test_on_fly_mutations;
SET mutations_sync = 0;
-- 在新表中插入一些行
INSERT INTO test_on_fly_mutations VALUES (1, 'a'), (2, 'b'), (3, 'c');
-- 更新行的值
ALTER TABLE test_on_fly_mutations UPDATE v = 'd' WHERE id = 1;
ALTER TABLE test_on_fly_mutations DELETE WHERE v = 'd';
ALTER TABLE test_on_fly_mutations UPDATE v = 'e' WHERE id = 2;
ALTER TABLE test_on_fly_mutations DELETE WHERE v = 'e';
让我们通过 SELECT
查询检查更新的结果:
-- 显式禁用轻量级更新
SET apply_mutations_on_fly = 0;
SELECT id, v FROM test_on_fly_mutations ORDER BY id;
请注意,当我们查询新表时,行的值尚未更新:
┌─id─┬─v─┐
│ 1 │ a │
│ 2 │ b │
│ 3 │ c │
└────┴───┘
现在让我们看看启用轻量级更新时会发生什么:
-- 启用轻量级更新
SET apply_mutations_on_fly = 1;
SELECT id, v FROM test_on_fly_mutations ORDER BY id;
SELECT
查询现在立即返回正确的结果,无需等待突变被应用:
┌─id─┬─v─┐
│ 3 │ c │
└────┴───┘
性能影响
启用轻量级更新后,突变不会立即材料化,而是仅在 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
- 如果为真,则非确定性函数在发起者副本上执行,并在UPDATE
和DELETE
查询中替换为文字。默认值:false
。mutations_execute_subqueries_on_initiator
- 如果为真,则标量子查询在发起者副本上执行,并在UPDATE
和DELETE
查询中替换为文字。默认值:false
。mutations_max_literal_size_to_replace
- 要在UPDATE
和DELETE
查询中替换的序列化文字的最大大小(以字节为单位)。默认值:16384
(16 KiB)。