首页/数据/数仓建模速查/ClickHouse:列存向量化分析引擎
湖仓与引擎63 条

ClickHouse:列存向量化分析引擎

ClickHouse 单机即可跑出高吞吐扫描性能:列式存储、向量化执行、稀疏索引;适合日志分析与宽表聚合,分布式部署需额外关注集群与副本。

数仓建模速查数据更新于 2026-10-13

ClickHouse 是什么

ClickHouse 是列式存储、向量化执行的 OLAP 数据库,单机就能跑出很高的扫描吞吐,因此常用于日志分析、行为明细与宽表聚合。它的索引是稀疏主键索引:数据按排序键有序存放,每隔若干行取一条标记,查询时先定位到数据块再在块内扫描。它不追求完整的关系库语义,多表 JOIN 与高频按主键更新都不是强项。

基本信息

存储列式存储,按列压缩与扫描
执行向量化执行,按数据块批处理
索引稀疏主键索引,配合分区与跳数索引
典型场景明细聚合、日志分析、宽表指标
常用引擎MergeTree 家族,去重场景用 ReplacingMergeTree

典型使用场景

  • 日志与埋点分析:单表大宽表,按时间过滤后做聚合
  • 行为明细即席查询:列存加向量化,扫描大量列也很快
  • 替代部分预聚合:直接在明细上算也能秒级返回,少维护一套汇总表
  • 宽表指标计算:建模时先把维度关联进宽表,避开多表 JOIN
  • 批量导入后分析:按月分区写入,查询带时间条件即可裁剪

建表与查询

建表与查询
CREATE TABLE dw.trade_order
(
  dt Date,                       -- 分区字段:按时间过滤
  order_id String,
  store_id String,
  pay_amt Decimal(18, 2)
)
ENGINE = MergeTree                -- 最常用的表引擎
PARTITION BY toYYYYMM(dt)         -- 按月分区
ORDER BY (store_id, dt);          -- 排序键,决定稀疏索引与裁剪效果

SELECT store_id, sum(pay_amt)
FROM dw.trade_order WHERE dt = '2026-10-13'
GROUP BY store_id;                -- 查询带时间条件才能裁剪分区

建表要素

要素作用经验
ENGINE决定数据合并与去重行为明细用 MergeTree,按主键去重用 ReplacingMergeTree
PARTITION BY划分数据目录,便于裁剪与批量清理常用按月分区,避免分区数过多
ORDER BY排序键,决定稀疏索引的粒度把最常用于过滤的列放在前面
主键与索引稀疏索引按排序键隔行取样过滤命中排序键前缀时裁剪效果最好
ClickHouse 更适合宽表聚合:多表 JOIN 的能力与关系库不同,建模时常见做法是把维度预先关联进宽表,用更高的存储冗余换取更稳定的查询性能。
ClickHouse 的删除与更新是异步的变更操作,不适合当作需要频繁按主键更新的业务库使用;这类需求应换用支持实时更新的表引擎或其他数据库。

易错点

  • 把大量复杂 JOIN 交给 ClickHouse:性能远不如按宽表建模,还容易内存超限
  • 排序键选错:常见过滤列没进入排序键前缀,扫描量成倍上升
  • 分区切得过细:小分区过多,后台合并压力与元数据开销同时上升
  • 用它承担频繁按主键更新的业务:更新与删除是异步重操作,延迟不可控
  • 高频小批量写入:每批都生成新数据块,后台合并压力剧增

数据来源与参考

  • ClickHouse 官方文档:Introduction
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌