OLAP 数据库篇:ClickHouse、Doris、StarRocks 与分析型数据库选择

OLAP 数据库面向大规模分析查询,核心能力是列式存储、向量化执行、分布式计算、预聚合和高吞吐扫描。

OLAP 数据库篇:ClickHouse、Doris、StarRocks 与分析型数据库选择

OLAP 是 Online Analytical Processing,在线分析处理。它和 OLTP 的问题完全不同。OLTP 关心一次订单状态修改是否正确,OLAP 关心的是能不能在几百亿行历史数据里快速算出趋势、分布、排行和指标。

报表、BI、实时大屏、用户行为分析、日志分析、指标平台、数据仓库,这些都是典型 OLAP 场景。

Rendering diagram...

OLAP 的查询特点

OLAP 查询通常会扫描大量数据,但只读取部分列。例如统计每天 GMV,可能只需要 event_dateamountstatus 三列,而不需要读取订单表里的收货地址、备注、物流单号等字段。

OLAP 查询经常包含聚合、过滤、分组、排序和 Join。它关注吞吐和整体扫描效率,而不是单行事务更新。

OLAP 写入通常是批量写入、流式写入或微批写入。它可以接受一定程度的数据延迟,但希望查询速度足够快。

为什么 OLAP 喜欢列式存储

列式存储把同一列的数据放在一起。这样查询少数列时,只需要读相关列。列数据类型相同,也更容易压缩。

列式存储对聚合非常友好。比如求 sum(amount),系统可以连续读取 amount 列并批量计算,而不必把每一行完整取出来。

列存的代价是单行更新通常不如行存自然。因为一行数据分散在多个列文件或列块里,频繁更新会让写路径更复杂。因此 OLAP 数据库通常更适合追加写、批量导入、异步合并和分析查询。

ClickHouse:高性能列式分析数据库

ClickHouse 是非常典型的列式 OLAP 数据库。它的核心优势是高吞吐扫描、列式存储、压缩、向量化执行,以及围绕 MergeTree 家族表引擎建立的一整套数据组织方式。

MergeTree 是 ClickHouse 最重要的表引擎家族。它支持分区、排序键、稀疏主键索引、数据跳过索引等能力。合理设计 PARTITION BYORDER BY,往往决定了 ClickHouse 查询性能的上限。

ClickHouse 特别适合日志分析、行为分析、宽表分析、指标聚合、明细数据查询和大吞吐报表。它的性能很强,但也要求使用者理解表引擎、分区、排序键、数据合并和写入批量。

ClickHouse 的常见使用方式是把数据整理成宽表或明细表,通过排序键提升过滤效率,通过物化视图或聚合表承接部分高频指标。

一个 ClickHouse 明细表例子:

CREATE TABLE user_events
(
  event_date Date,
  event_time DateTime,
  user_id UInt64,
  event_name LowCardinality(String),
  page String,
  properties String
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(event_date)
ORDER BY (event_name, event_date, user_id);

它的挑战包括:复杂更新能力不是传统 OLTP 风格;高频小批量写入可能造成较多 parts;分布式集群运维需要理解副本、分片和合并行为;复杂多表 Join 场景需要谨慎建模。

Apache Doris:实时数仓与易用性取向

Apache Doris 是面向实时分析的数据仓库系统,采用 MPP 架构,强调简单易用、实时写入、报表分析和高并发查询。

Doris 的一个重要特点是把很多数据仓库能力做成相对一体化的系统。它支持多种数据模型,比如明细模型、聚合模型、主键模型等,适合承接不同分析场景。

在实时数仓场景里,Doris 经常被用来接 Kafka、Flink、CDC 或批量导入,把业务数据、日志数据和指标数据放进统一的分析库中。

Doris 比较适合希望快速搭建实时数仓、报表系统和多维分析平台的团队。它在数据导入、SQL 查询、物化视图、主键更新、聚合模型等方面提供了较完整的工程能力。

一个 Doris 明细模型例子:

CREATE TABLE dwd_order_detail (
  order_date DATE,
  order_id BIGINT,
  user_id BIGINT,
  sku_id BIGINT,
  channel VARCHAR(64),
  pay_amount DECIMAL(12, 2)
)
DUPLICATE KEY(order_date, order_id)
PARTITION BY RANGE(order_date) ()
DISTRIBUTED BY HASH(order_id) BUCKETS 16;

它的挑战在于:系统能力较多,需要理解不同表模型的适用边界;高并发、实时写入和复杂查询同时存在时,需要认真设计分区、分桶、模型和资源隔离。

StarRocks:强调极速查询、CBO 和湖仓分析

StarRocks 同样是 MPP 架构的分析型数据库,强调向量化执行、列式存储、成本优化器 CBO、物化视图、实时更新和数据湖分析能力。

StarRocks 的一个突出方向是高性能多维分析和复杂查询。它希望在宽表查询、Join、聚合、实时更新和湖仓查询上提供较好的统一体验。

StarRocks 提供多种表类型,包括明细表、主键表、聚合表、更新表,用来适配原始明细、实时更新、预聚合等不同场景。主键表对实时更新和部分更新场景比较关键。

一个 StarRocks 主键表例子:

CREATE TABLE order_wide (
  order_id BIGINT,
  user_id BIGINT,
  order_status VARCHAR(32),
  pay_amount DECIMAL(12, 2),
  updated_at DATETIME
)
PRIMARY KEY(order_id)
DISTRIBUTED BY HASH(order_id) BUCKETS 16;

如果你的场景里 Join 较多、实时更新较多、希望较好地支持湖仓分析,StarRocks 往往会进入候选名单。

它的挑战在于:要真正发挥性能,需要理解表类型、排序键、分区分桶、物化视图改写、CBO 统计信息和资源管理。越强的系统,越需要正确的建模和治理。

ClickHouse、Doris、StarRocks 的差异

ClickHouse 的气质更像“极致列式分析引擎”。它在大宽表、日志、明细分析、聚合扫描上非常强,适合能接受围绕 MergeTree 建模和调优的团队。

Doris 的气质更像“实时数仓一体化平台”。它强调易用、导入、表模型、物化视图和报表服务,适合希望较快搭建实时数仓和 BI 分析的团队。

StarRocks 的气质更像“高性能 MPP 分析引擎 + 湖仓查询层”。它强调 CBO、向量化、Join、实时更新和数据湖分析,适合复杂查询和实时分析并重的场景。

简单说:

  • 大规模日志和明细宽表分析,可以优先看 ClickHouse。
  • 实时数仓、报表服务、一体化易用性,可以重点看 Doris。
  • 复杂 Join、实时更新、湖仓查询和高性能交互分析,可以重点看 StarRocks。

这不是绝对边界。三者都在快速演进,能力也有重叠。真实选型要结合数据量、查询形态、写入方式、团队经验和运维能力。

维度ClickHouseApache DorisStarRocks
核心气质高性能列式分析引擎实时数仓一体化高性能 MPP + 湖仓分析
常见强项明细宽表、日志、聚合扫描报表、实时数仓、易用导入Join、CBO、实时更新、湖仓查询
表设计重点MergeTree、分区、排序键数据模型、分区分桶、物化视图表类型、分区分桶、统计信息
写入关注点批量写入、parts 合并实时导入和模型选择主键更新、导入与查询并发
适合团队能围绕 ClickHouse 深度调优希望快速搭实时数仓复杂查询和实时分析并重

OLAP 表设计建议

第一,先理解查询,再设计表。OLAP 表不是把 OLTP 表原样搬过去。报表查询关心哪些维度、指标和过滤条件,表结构就应该围绕这些访问模式设计。

第二,明细表和聚合表要分工。明细表保留可追溯数据,聚合表服务高频指标。不要指望所有查询都扫明细。

第三,时间分区通常很重要。大多数分析查询都有时间范围,按天、月或业务周期分区可以显著减少扫描。

第四,排序键要服务过滤和聚合。用户 ID、商家 ID、事件时间、渠道、状态等字段是否适合做排序键,要看查询条件和数据分布。

第五,实时写入要控制批量。OLAP 数据库一般不喜欢极端零散的小写入,Kafka、Flink、批量导入和微批攒批都很常见。

OLAP 常见坑

第一个坑是直接照搬业务库表结构。业务库是为事务设计的,分析库是为查询设计的。很多时候需要宽表、快照字段和预聚合。

第二个坑是指标口径不统一。技术架构再漂亮,如果 GMV、UV、转化率的定义不一致,报表就会互相打架。

第三个坑是忽视数据延迟。实时分析系统不是只看查询速度,也要看采集、传输、计算、写入、查询整条链路的延迟。

第四个坑是只追求 benchmark。公开 benchmark 很有参考价值,但真实业务的数据分布、查询模式、并发模式和运维能力更重要。

小结

OLAP 数据库不是更快的 MySQL,而是面向分析问题重新设计的一类系统。它用列式存储、压缩、向量化执行、分布式计算、物化视图和预聚合来解决大规模查询问题。

ClickHouse、Doris、StarRocks 都是优秀的 OLAP 选择,但它们的工程侧重点不同。选型时不要先问“哪个最快”,而要先问:我的数据怎么写入,查询怎么发生,是否需要实时更新,Join 多不多,团队能不能长期维护。

参考链接

社区讨论参考