clickhouse21.7.11.3 Optimize Table

提出问题

Clickhouse作为一款OLAP数据库,对数据更新的支持比较弱,而且并不支持标准的SQL update 、 delete 语法;

提示:提供的 alter table ...... update/delete 语法也是 异步的,即收到命令后先返回给客户端成功,至于什么时候数据真正更新成功是不确定的。

因此在业务需要 数据更新 的场景下(如Mysql同步到Clickhouse),通常会使用以下引擎(支持数据合并):

  • ReplacingMergeTree
  • CollapsingMergeTree

好处:

  • 保证数据的最终一致性
  • 性能开销也会比 alter table 小

缺点: 这两个引擎的数据合并过程(merge),是基于策略控制的,执行时间比较随机,因此数据一致性缺少时间保证,极端情况下数据过了一天也没有完全合并。

解决

Optimize Table 命令可以强制触发引擎的 数据合并,即:手动合并临时分区,可以用来解决数据合并时间不确定的问题。

官网:
https://clickhouse.com/docs/en/sql-reference/statements/optimize/

语法

OPTIMIZE TABLE [db.]name [ON CLUSTER cluster] [PARTITION partition | PARTITION ID 'partition_id'] [FINAL] [DEDUPLICATE [BY expression]]

解释:

  • OPTIMIZE TABLE:指定需要Optimize的表,只支持 MergeTree 家族引擎。

  • PARTITION:若指定了分区,则只会对指定的分区触发合并任务。

  • FINAL:即使只有一个文件块也执行合并,即使有并行的正在执行的合并,也会强制执行这一次合并。

  • DEDUPLICATE:去重,若没有后续的 BY 子句,则按照行完全相同去重(所有字段值相同)。

  • BY:配合 DEDUPLICATE 关键词使用,指定依据哪些列去重。

例子

  1. clickhourse21.7.11.3 表引擎-ReplacingMergeTree

  2. clickhourse21.7.11.3 表引擎-SummingMergeTree

参考:
https://cloud.tencent.com/developer/article/1888949


原文出处:/show_1IX3RMFqoZO1.html