资讯动态

OLAP技术演进与选型实战:从列式存储到实时数仓的架构指南

发布时间:2026/9/9 22:16:06 来源:尧图企业网站定制
1. OLAP 技术演进从传统数仓到实时分析的必然之路聊到大数据就绕不开 OLAPOnline Analytical Processing联机分析处理。如果你是一个刚接触数据领域的新人或者是从后端转数据开发的工程师入行第一年感触最深的一定是“查数容易查得快难”。OLAP 就是专门解决这个“难”字的技术体系。这几年大数据领域的技术迭代快得吓人十年前大家还在讨论 Hive 跑批任务怎么优化三年前社区开始疯狂追捧 ClickHouse现在再聊主流声音已经转向 Doris、StarRocks、Trino、云原生数仓这些方向了。作为一线从业者我的感受是OLAP 技术正处在一个从“能用”到“好用、敢用、实时用”的跨越阶段。未来几年的走向会直接决定你的技术选型、架构设计甚至职业发展方向。这篇文章我想结合自己这些年做数据平台、数据中台、实时数仓的实战经历把 OLAP 领域的技术脉络、主流引擎选型、核心优化手段以及我自己判断的几个趋势方向一次性讲透。文章不预设读者有很深的基础但如果你已经接触过 SQL、Hive、Spark 这类工具看起来会更顺手。1.1 OLAP 解决的核心问题多维分析为什么这么吃性能先掰扯清楚 OLAP 到底在解决什么问题。你做一个电商平台订单表一天涨几百万行。老板想看“华东区上个月每天每个品类的销售额和去年同期对比”这条 SQL 跑在 MySQL 上大概率慢到让你怀疑人生。为什么慢因为关系型数据库OLTP设计时优先保证的是事务一致性数据按行存储索引针对单行或少量行的增删改查优化。一旦面对几千万行甚至几亿行的聚合计算行式存储的磁盘 IO 和 CPU 开销根本扛不住。OLAP 的分析场景恰恰相反它不关心单条订单记录长什么样关心的是“按时间维度、地区维度、品类维度”把上亿行数据实时聚合、切片、钻取。这个场景有几个天然痛点数据量巨大动辄上亿行起。查询往往要扫描全表或大范围数据。维度组合千变万化无法靠固定索引覆盖。响应时间要求高交互式分析希望秒级返回。这就是 OLAP 引擎存在的原因通过列式存储、向量化计算、分布式并行等手法把“大海捞针”式的点查变成“分片并行扫描聚合”的批量计算硬生生把分钟级的分析压到秒级甚至毫秒级。1.2 一条清晰的技术演进线批处理、交互式分析、实时数仓OLAP 技术发展到今天有一条非常清晰的脉络。最早是传统数仓时代Oracle、Teradata、Greenplum 这类并行数据库把数据分析从“手工报表”拉到了“SQL 查询”时代。但传统 MPP 数据库的扩展性有限、成本高昂在海量数据面前有点吃不消。接着进入 Hadoop 时代Hive 用 MapReduce 做离线批处理解决了“数据太大算不动”的问题代价是一个查询跑几分钟甚至几小时交互式分析基本无从谈起。所以后来出现了 Impala、Presto 这类 SQL on Hadoop 引擎把查询引擎从批处理框架里剥离出来用分布式内存计算把秒级响应变成可能。这几年的大趋势则是实时数仓和湖仓一体。Lambda 架构那种“离线一套、实时一套”的玩法逐渐暴露出维护成本高、数据口径不一致的问题。Kafka 接 Flink 做实时 ETL结果直接写入 Doris、StarRocks、ClickHouse 这类新一代 OLAP 引擎让“实时分析”成为默认配置。这套架构的核心变化在于OLAP 引擎不只负责承接查询还承担了实时写入、高并发点查、甚至部分 ETL 工作。2. 主流 OLAP 引擎选型特点对比与适用场景分析先给一个结论目前市场上没有任何一个 OLAP 引擎是万能的。选型从来都不是“哪个最好”而是“哪个最适合你的场景”。2.1 ClickHouse极致性能的单表分析王者ClickHouse 是这些年性能神话的代名词。我第一次拿它跑一个 5 亿行的订单明细表GROUP BY 按用户维度聚合冷数据场景下秒级出结果那种震撼感至今记忆犹新。它的核心竞争力在于列式存储加稀疏索引磁盘扫描量被压到极致。向量化执行引擎充分利用 CPU 的 SIMD 指令单核处理能力惊人。极致的合并树MergeTree表引擎让批量写入性能非常高。但 ClickHouse 的短板同样明显。首先它不支持完整的事务。多表 JOIN 能力虽然随着版本迭代有提升但和传统数据库比仍有差距。其次高并发点查场景比如几千人同时做报表查询容易踩 CPU 瓶颈因为它的架构没有针对并发做太多优化。最后数据更新和删除的语法限制较多常规做法是借助 AggregatingMergeTree、ReplacingMergeTree 这类特殊表引擎去“曲线救国”。所以ClickHouse 最适合的应用场景是单张宽表的海量数据聚合分析、行为日志分析、监控指标存储查询。当你只需要在几十亿行数据上做“多维聚合下钻”时ClickHouse 基本是最优解之一。2.2 Apache Doris / StarRocks实时数仓的一体化新宠Doris 和 StarRocks 这两个项目渊源很深都属于 MPP 架构的新一代分析型数据库。它们在设计理念上有一个共同点想同时解决“实时写入”和“高性能查询”两个问题做到极致的流批一体。为什么我最近两年在项目中越来越多地推荐 Doris因为它把很多以前需要“组合拳”才能搞定的事情集成了支持 MySQL 协议业务方可以用生态里最常见的客户端直接对接。支持高频实时写入Kafka 数据可以秒级可见。内置了 Rollup 表、物化视图、同步物化视图等一套完整的预聚合体系可以让查询直接命中预先算好的结果。JOIN 能力比 ClickHouse 强不少查询优化器在复杂查询场景下的表现更稳。支持冷热数据分层单集群可以同时处理热数据和历史归档数据。StarRocks 和 Doris 在很多核心能力上同源但 StarRocks 在查询优化器CBO和某些复杂查询场景上做得更激进比如更完善的开源生态、对大规模并发查询的支持。如果团队非常看重实时性、希望一套引擎同时覆盖“明细查询汇总查询实时写入”Doris 和 StarRocks 都是首选项。2.3 Presto / Trino灵活的数据湖查询联邦引擎Presto 和它的社区分支 Trino 定位不太一样它们不是一个存储引擎而是一个“查询联邦引擎”。你可以把它理解为“数据世界的路由器”——它自己不存数据但它能同时连上 Hive、HDFS、MySQL、Iceberg、Delta Lake、Elasticsearch、Kafka然后在一个 SQL 里完成跨数据源的 JOIN。这类引擎最大的价值是“灵活”。数据湖场景下可以直接查询 Parquet、ORC 文件不需要提前导入数据库。跨源查询能力强大一条 SQL 可以同时访问生产 MySQL、Hive 数仓、对象存储。不像专业 OLAP 引擎那样需要维护数据导入、分区分桶策略。但它的代价也很明显本身没有存储层每一查询都要现场拉取远端数据网络 IO 开销大没有预聚合能力同样一条聚合 SQL 跑在 Presto 上往往比跑在 ClickHouse 上慢一个数量级规模大了之后集群资源消耗非常吓人。所以 Presto/Trino 最适合做“探索式分析、即席查询、数据湖 T0 分析”而不适合做固定报表的高并发服务。2.4 选型决策框架按四个维度做判断我在实际项目里总结了一套相对好用的选型决策框架核心就四个维度。第一个维度是查询模式。如果绝大部分查询是“大宽表 多维聚合”ClickHouse 性能最猛如果查询涉及大量多表 JOIN 且对灵活性要求高Doris/StarRocks 更合适如果查询目标是 HDFS 或数据湖上的文件Trino 是几乎没有替代品的选择。第二个维度是数据更新频率。T1 离线更新为主ClickHouse 完全能扛实时写入是刚需Doris/StarRocks 的实时导入链路更顺滑。第三个维度是并发度。几百人的 BI 报表平台ClickHouse 容易在高并发下抖动Doris/StarRocks 这类 MPP 数据库对并发支持好得多。第四个维度是运维能力。ClickHouse 的运维其实不算简单版本升级、节点替换、磁盘均衡都要认真搞Doris/StarRocks 自带完善的运维工具和监控面板上手难度低很多。维度ClickHouseDoris / StarRocksPresto / Trino存储自研列式存储自研列式存储无存储对接外部查询性能单表聚合极强多表 JOIN 较弱均衡复杂查询能力强一般依赖数据源实时写入支持但限制较多强支持秒级可见不支持高并发较弱较强一般适用场景行为分析、监控、宽表聚合实时数仓、BI 报表、统一分析数据湖查询、跨源联邦分析3. OLAP 核心关键技术拆解为什么这些引擎能跑这么快我一直觉得只会用工具不会看原理遇到问题就只能瞎试。OLAP 引擎能比传统数据库快几个数量级背后不是魔法是几个非常具体的技术设计。理解这些核心机制才能在调优时“对症下药”。3.1 列式存储把 IO 开销砍到极致OLAP 引擎最基础的设计就是列式存储。行式存储下你要计算“每个用户的消费总额”磁盘会把每一行的所有字段都读出来——包括用户名、地址、手机号、备注信息这些和分析无关的列。而列式存储只在磁盘上读取需要的列比如“用户ID”和“消费金额”两列IO 量直接降了一个数量级以上。配合高压缩比编码字典编码、位图编码、增量编码、ZSTD、LZ4 等列数据在磁盘上的体积还能再压缩好几倍。我见过一个真实案例一张 2TB 的行存订单表改造成列式存储后参与查询的列数据压缩后只有 80GB查询速度提升接近 20 倍。理解列存就可以理解很多优化建议背后的逻辑。比如“尽量不要 SELECT *”因为你每多查一列引擎就要多扫描一列没有 IO 是白来的。3.2 数据预排序与稀疏索引快速定位数据块光有列存还不够如何快速跳过不相关的数据块是提升查询速度的第二层关键。以 ClickHouse 的 MergeTree 为例数据会按照表定义的 ORDER BY 字段进行物理排序同时每隔 N 行默认 8192 行记录一个主键索引项。这个索引不是传统 B 树那种“逐行定位”而是一个稀疏索引——它只告诉你“这个范围的数据在哪些数据块里”。这种设计的精妙之处在于当你按排序键查询时引擎会通过稀疏索引快速跳过绝大部分数据块。即使查询条件不是排序键也可以借助 minmax 索引或布隆过滤器做粗粒度过滤。大部分聚合分析场景只需扫描少量数据块而不是全量数据。所以“ORDER BY 字段的选取”非常关键。比如你有一张订单表最常见的查询条件是“按时间范围查”那 ORDER BY 里必须放日期字段否则时间过滤条件就会失效表现就是查询全表扫。3.3 向量化执行引擎让 CPU 满载干活OLAP 引擎这波性能飞跃的另一个核心功臣是向量化执行。传统数据库执行 SQL 时是一行一行地处理数据从存储层读一行计算再读一行……这种方式 CPU 的流水线几乎一直在“空转等数据”。向量化执行的核心思路是把数据处理改成批量操作——一次从内存里取一批数据比如 1024 行然后对这 1024 行数据应用同一个运算指令充分利用 CPU 的 SIMD 单指令多数据能力让一个指令同时操作多个数据。用生活化的类比解释传统方式是“一个快递员骑电动车一个包裹一个包裹地送”向量化是“一辆大卡车一次性拉几百个包裹到了小区再按楼栋分发”。后者的单件成本优势在城市级配送场景里是碾压级的。这也是为什么你在观察 ClickHouse 的查询执行计划时经常会看到“Expression 向量化执行”“Filter 向量化执行”这类字样。越多的算子被向量化处理CPU 利用率越高查询越快。3.4 分布式并行与 MPP 架构多节点协同作战当单机性能达到上限的时候就得靠横向扩展。这也是 MPPMassively Parallel Processing大规模并行处理架构存在的意义。MPP 架构的核心思想是把一个大查询拆分成多个小任务在集群的多个节点上并行执行然后汇总各自的结果。比如一个 GROUP BY 查询每个节点只扫描自己本地的分片数据算出一个局部聚合结果再通过网络把局部结果汇总到协调节点做最终聚合。这种架构下理论上节点的数量越多查询越快。但实际工程里有几件事必须做好数据分布策略要合理尽量避免查询时发生大规模的数据跨节点 Shuffle。查询优化器要能把“最优执行计划”算出来避免某个节点成为查询瓶颈。协调节点的内存、CPU 要足够强否则大查询在汇总阶段容易把协调节点拖垮。Doris、StarRocks、Presto 都是典型的 MPP 架构。ClickHouse 虽然也有分布式表Distributed Table但它的默认设计更偏向“本地表 手动分片”和“一个查询自动并行推送到所有节点”的 MPP 引擎相比使用体验不同踩坑方式也不一样。3.5 物化视图与 Rollup 预聚合用空间换时间预聚合可能是 OLAP 领域最“老土”但也最有效的手段。它的核心想法很简单既然很多报表查询经常从几亿行明细数据里按“天 品类”做聚合为什么不在数据写入的时候顺手把聚合结果算好存起来这样查询的时候直接读几百万行的中间结果而不是每次去扫几亿行的明细数据。Doris 和 StarRocks 的实现方式比较友好它们支持创建物化视图Materialized View自动维护明细表到聚合表的转换。前缀索引匹配机制让查询自动命中合适的物化视图用户甚至不需要改 SQL。ClickHouse 的 AggregatingMergeTree 也提供类似能力用 AggregateFunction 类型字段存储聚合中间状态查询时直接读取预聚合结果性能非常快。我踩过的坑是物化视图的数量别贪多。预聚合本质上是“一份数据多份存储”建太多不仅占用磁盘还会拖慢导入性能。一般只对“高频固定报表”创建物化视图探索式分析查询就别折腾这个了。4. 从零到一落地 OLAP 平台一套通用部署与调优实践讲完原理来点实操经验。我结合近两年做过的实时数仓项目以 Doris 为例整理一套相对通用的落地路径从集群规划到上线调优的关键环节都会覆盖到。这套思路对 StarRocks、ClickHouse 也基本适用只是在具体参数上略有差别。4.1 集群规划与容量预估第一步是确定集群规模。很多团队一上来就拍脑袋买机器导致要么浪费成本要么上线没俩月就瓶颈。我一般建议按这两个核心指标估算原始数据日增量。查询并发量与查询复杂度。假设每天新增订单明细 5000 万行每行约 300 字节一天原始数据约 15GB。加上索引、副本、预聚合和临时数据磁盘空间至少按原始数据的 10 倍规划即 150GB 每天。如果保留 30 天数据差不多准备 4.5TB 存储空间。这个规模用 3 台 16 核 64GB 内存、4TB SSD 的物理机或云主机就够了。内存规划方面我的经验值是单机内存建议 64GB 起步查询的数据总量最好控制在内存的 3 倍以内这样才能保证热数据查询命中内存避免频繁访问磁盘。4.2 关键参数配置实操Doris 部署完成后有几个参数我每次必调。第一个是max_connection_scheduler_threads_num。这个控制的是 BE 节点上处理查询请求的线程数默认值偏保守。在 16 核机器上我会调到 32 或 64能明显提升并行查询处理能力。第二个是streaming_load_max_mb。Doris 常规的 Stream Load 单次导入上限默认是 10GB但对于超大文件需要调大这个参数的阈值否则导入会报错失败。第三个是exec_mem_limit。这是每个查询单个 BE 节点上可用的内存上限默认 2GB对于大查询明显不够。我们会根据集群总内存按比例调大比如 64GB 内存的机器设置到 8GB~16GB 都是对的。值得强调的一点是参数调整一定要小步快跑、观察监控曲线不要一次性把内存全部怼上去否则 OLAP 机器最容易出现的 OOM 问题就会找上门。4.3 数据建模与分区分桶数据建模这一步决定了下游所有查询的性能下限。分区Partition层面通常按日期做分区好处是数据裁剪、生命周期管理都非常方便——过期数据直接删分区比 DELETE 快几个量级。分桶Bucket层面建议按高基数字段做分桶比如用户 ID、订单 ID。分桶数量需要根据数据量合理设置太小会导致单个桶数据过大并行度不够太大会导致小文件过多查询时元数据开销变大。我通常把单个桶的数据量控制在 5000 万到 1 亿行之间。排序键Duplicate Key / Unique Key / Aggregate Key设计这块要遵循“最常用过滤字段放最前面”的原则。比如订单表最常用的查询是“按时间查”那就把日期字段放在排序键最前面如果还经常按用户查那排序键可以设计成(dt, user_id)。4.4 实时链路接入实战当前主流的实时数仓链路是业务库 Binlog 或应用埋点日志 → Kafka → Flink 做 ETL 清洗 → Doris/StarRocks 实时写入。落地时要注意几个点Flink 写入 Doris 时官方提供的flink-doris-connector支持两阶段提交。开启后能实现精确一次Exactly-Once语义避免重复消费导致的数据重复。这里需要配合 Doris 的 Unique 模型使用主键冲突时按版本号保留最新记录。实时导入报错最常见的两类是数据格式不匹配比如日期格式“2024/01/01”但表定义的是“2024-01-01”。主键冲突导致部分批次整体失败。排查时第一件事就是去 FE 的日志和 BE 的日志里翻StreamLoad相关记录大部分错误信息都写得很直白。4.5 常见问题与调优速查表现象可能原因排查方法大查询超时exec_mem_limit 过小调大单查询内存限制导入速度慢分区过多/小文件过多合理设置分区分桶开启批量导入聚合查询慢物化视图未命中用 EXPLAIN 查看执行计划并发查询跑满 CPU并发太高且未限流设置 query 队列或限流规则查询结果不准存在未合并的 Merge 版本触发 compaction 或查看 FE 版本这里尤其想强调一下EXPLAIN的重要性。很多新手调 OLAP 查询上来就改参数或者换 SQL 写法其实第一步应该是看执行计划。执行计划会告诉你这个查询是全表扫描还是命中了分区裁剪是在本地聚合还是跨节点 Shuffle 了瓶颈卡在哪个算子上了。调优之前先看计划至少能帮你少走一半弯路。5. OLAP 技术未来趋势展望实时、湖仓、AI、云原生最后聊聊趋势。作为从业者我真的建议每个搞数据的人都对技术方向保持敏感因为选对了方向学习学习 ROI 会高很多。5.1 实时化与流批一体将成绝对主流过去“T1 离线数仓 实时大屏”两套系统并行的架构越来越难满足业务需求。老板不止要昨天的报表他们要“现在这一刻”的数据。未来两到三年流批一体会从概念走向大规模工程落地。核心变化是一套 SQL、一套数据模型、一套计算引擎同时处理实时流数据和离线批数据。目前 Flink 在计算层的流批一体已经做得不错而存储层的流批一体正在通过 Doris、StarRocks 这类实时 OLAP 引擎逐步实现。它们可以同时接受实时 Kafka 数据流和批量导入的离线数据然后在统一的存储视图下提供查询。这个趋势对数据工程师的要求是不能再只盯着离线 Hadoop 生态Kafka、Flink、实时 OLAP 引擎将成为基础技能。5.2 湖仓一体将重塑数据架构数据湖Iceberg、Hudi、Delta Lake 为代表和数仓的传统边界正在被打破。数仓的性能好但存储成本高、数据格式封闭数据湖存储成本低、开放性强但查询性能一言难尽。未来趋势一定是两者取长补短的“湖仓一体”数据放在低成本的对象存储上用开放的表格格式管理元数据再通过高效的 OLAP 引擎直接查询。这个方向上Trino 是先行者但它的查询性能还有提升空间。Doris/StarRocks 已经支持直接查询 Hive/Iceberg 表很多社区版本还在不断强化。以后你再也不用纠结“数据到底该放数仓还是数据湖”引擎会直接帮你抹平这层差异。5.3 AI 赋能智能调参、智能优化、自然语言查询大模型浪潮对 OLAP 的影响不会缺席。我判断短期内会有三个具体落地方向。第一个是智能索引推荐。系统自动分析历史查询日志自动推荐需要创建的物化视图、分区策略、排序键组合把 DBA 人工调优的经验变成自动化的能力。第二个是自然语言转 SQL。业务分析师直接说“上个月华东区每个品类销量前 10”系统自动生成 SQL 并执行。目前不少头部 BI 厂商已经在做这个功能准确率还有提升空间但方向已经明确。第三个是查询优化器的 AI 化。用机器学习模型预测查询耗时自动选择连接顺序、Join 策略、并行度让优化器不再依赖手工统计信息和规则。5.4 云原生与 Serverless 化传统自建 OLAP 集群的一个痛点是资源预估难高峰不够用低峰纯浪费。云原生和 Serverless 化能很好地解决这个矛盾。未来 OLAP 引擎会把存储和计算彻底分离数据都放在对象存储里计算集群按需弹性伸缩查询来了就拉起一批临时节点查询结束就释放。这样既保证性能又控制成本。目前 ClickHouse Cloud、Doris 的存算分离版本都在往这个方向走。如果你所在的团队已经在用云服务选型时优先看引擎是否支持存算分离这会避免未来两三年做不必要的架构迁移。5.5 HTAP 融合在线事务与分析不再强分家HTAPHybrid Transactional/Analytical Processing混合事务与分析处理的热度也在上升。简单说就是一个系统既能处理事务型写入又能处理分析型查询避免数据“写完再同步一份到数仓”的链路。TiDB 是 HTAP 方向的代表TiFlash 列存引擎让它可以在一个数据库里同时服务OLTP和OLAP场景。Doris、StarRocks 也在逐步引入主键更新模型提高单行级更新的能力。虽然 HTAP 在极致性能上还比不过“专职专用”的组合架构但对于中小团队来说一套系统搞定两件事性价比确实突出。从我个人的经验来看未来做技术选型没必要一开始就把 OLTP 和 OLAP 完全割裂。如果业务模型简单、数据规模可控一个 HTAP 数据库就能满足需求如果数据量大、查询复杂再选择专用 OLAP 引擎也不迟。聊到这儿想说的是OLAP 从“Oracle 报表时代”一路走到今天的“实时数据仓库 数据湖 云原生”本质上都是在回答同一个问题——如何让数据更快、更准、更灵活地被业务使用。不同引擎、不同架构的选择没有绝对的对错只有基于业务场景的权衡。我自己摸索这些年最大的体会是别盲目追新也别固守旧栈。先把列存、MPP、向量化、预聚合这些底层原理吃透再根据业务选择最合适的落地方案才是这条路上最稳的走法。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价