首页/数据/NoSQL 速查/CollapsingMergeTree 折叠变更新
ClickHouse56 条

CollapsingMergeTree 折叠变更新

CollapsingMergeTree 用一个 Int8 的 Sign 列表达增删:+1 状态行与 -1 取消行在合并时抵消,适合保留变更轨迹的流水场景;读取未折叠数据可用 sum(Sign) 修正。

NoSQL 速查数据更新于 2026-10-12
引擎参数CollapsingMergeTree(sign),sign 取值 1 或 -1
合并行为同排序键的一对 +1/-1 行在合并时抵消,数据量随时间收敛
读取修正SELECT … , sum(Sign) as s … GROUP BY key HAVING sum(Sign) > 0
替代VersionedCollapsingMergeTree(sign, version) 用版本列允许乱序到达

示例

示例
CREATE TABLE page_views
(
    user_id UInt64,
    views UInt64,
    Sign Int8
)
ENGINE = CollapsingMergeTree(Sign)
ORDER BY user_id;

-- 变更时写入取消行 + 新状态行(插入顺序遵循官方示例)
INSERT INTO page_views VALUES (1001, 7, 1);
INSERT INTO page_views VALUES (1001, 7, -1), (1001, 8, 1);

-- 未折叠数据按 Sign 修正读取
SELECT user_id, sum(views * Sign) AS v
FROM page_views
GROUP BY user_id
HAVING sum(Sign) > 0;
折叠依赖合并,未合并时同一主键会出现多行;业务读取不写 FINAL 时用上面这个标准修正写法。

易错点

  • 插入顺序错误会导致折叠结果不符预期,落地前对照官方示例验证一次
  • 频繁的取消行会放大写入量,纯最新状态场景优先 ReplacingMergeTree

数据来源与参考

  • ClickHouse Docs: CollapsingMergeTree
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌