在分析型数据库的性能比拼中,“少做事” 往往比 “快做事” 更关键 —— 数据读取过程中的磁盘 IO、网络传输(尤其存算分离场景)是资源消耗的核心,而数据裁剪正是通过 “跳过不需要处理的数据”,从根源降低开销。
Apache Doris 作为面向实时分析的现代数据仓库,设计了多维度的数据裁剪与过滤机制,覆盖 “静态谓词过滤→动态场景优化(LIMIT/TopK/JOIN)” 全链路。本文将深入拆解这些机制的实现原理,带你理解 Doris 如何做到 “智能跳过无用数据”。
数据裁剪的核心逻辑是 “提前排除不符合条件的数据,减少后续计算的输入量”—— 对于 100TB 的原始数据,若能裁剪掉 99%,则后续计算只需处理 1TB,性能提升呈数量级增长。
行业内主流数据库已形成成熟的裁剪思路:
zone map(存储列的 min/max 值)、SMA(小物化聚合)跳过不满足谓词的分区 / 文件;Doris 的裁剪机制在吸收这些思路的基础上,结合自身 “MPP 架构 + 列存储 + 有序 Segment” 的特性,实现了更贴合实时分析场景的优化。
要理解裁剪逻辑,需先明确 Doris 的数据组织方式 —— 裁剪机制本质是 “利用数据存储的结构化特征,精准定位有用数据”。
Doris 集群由三大组件协同:

Doris 的表按 “三级结构” 组织数据,每一层都为裁剪提供切入点:

a)拆分,元数据记录每个分区的范围(如partition1: a<1,partition2: 1≤a<2);b)Hash 拆分,确保数据均匀分布;a,b)有序排列,且包含:Doris 按 “裁剪发生的时间” 将机制分为两类:
a>0过滤p1分区”;
具体可细分为四种核心机制:谓词静态过滤、LIMIT 动态裁剪、TopK 裁剪、JOIN 裁剪,下文逐一拆解。
谓词静态过滤是 Doris 最基础也最高效的裁剪方式,通过 “FE 解析 SQL 谓词 + 存储元数据比对”,在数据读取前就排除无用分区 / 文件 / 行,分为三类场景。
核心逻辑:分区列的谓词(如a>0)由 FE 处理,通过查询分区元数据(每个分区的范围),直接跳过不满足条件的分区。
以 SQL SELECT * FROM tbl WHERE a>0为例:
p1(a<1)、p2(1≤a<2)、p3(2≤a<3);a>0:p1包含a<1的部分数据(如a=-1)不满足,但p1整体范围与a>0有交集(如a=0.5),因此不跳过p1;p2、p3完全满足,全部保留;p1、p2、p3的读取任务下发给 BE,无需处理不存在的分区(如a≥3)。
优势:完全在 FE 层完成,无需 BE 参与,是开销最小的裁剪方式。
核心逻辑:Key 列(如b)在 Segment 内有序存储,通过谓词生成 Key 列的上下界,用二分查找确定需读取的行范围,跳过范围外的数据。
以 SQL SELECT * FROM tbl WHERE b>0为例(b是 Key 列):
a,b)有序数据,假设某 Segment 的b值为[-2, -1, 1, 2, 3];b>0的下界是0,通过二分查找定位到第一个满足条件的行(b=1,行号 1);b=-2,-1),减少 50% 的行读取量。
核心逻辑:普通列(如c)的列文件头记录该列的 min/max 值,BE 先比对 min/max 与谓词,跳过不满足的列文件;对满足的列文件,读取后计算谓词,得到符合条件的行号,再读取其他列的对应行。
以 SQL SELECT * FROM tbl WHERE c>2为例(c是普通列):
c列文件:2,直接跳过该文件;c值;c值(如[1,3,4,2,5])计算谓词,得到符合条件的行号(1,2,4);a,b)的行号 1,2,4 的数据,避免读取全量行。
优势:通过列文件元数据提前排除无用文件,减少磁盘 IO;列存储特性确保仅读取需处理的列,进一步降低开销。
LIMIT 查询的核心需求是 “获取前 N 行数据”,Doris 通过 “提前停止数据读取” 避免无用计算,分两种场景优化。

场景:当 LIMIT 直接作用于 Scan 节点(如SELECT * FROM tbl LIMIT 100),Doris 会:
例:若表中有 10 万行数据,LIMIT 100 时,BE 读取 100 行后就停止,仅处理 0.1% 的数据。
场景:当 LIMIT 作用于后续节点(如SELECT SUM(c) FROM tbl GROUP BY b LIMIT 100),Doris 会:
核心:从下游反向触发上游停止,避免 “上游计算完所有结果,下游只取前 N 行” 的资源浪费。
TopK 查询(如 “取 GMV 前 10 的商品”)是 BI 分析的高频场景,传统做法是 “全量排序后取前 K”,开销极大。Doris 通过 “局部裁剪 + 全局汇总” 的两阶段策略,大幅减少数据处理量。
传统 TopK 用 “最小堆”(降序排序):扫描所有数据,插入堆中(堆大小为 K),最终堆中数据即为 TopK。但问题是 “必须扫描全量数据”,若数据量达 10 亿行,堆操作的开销依然巨大。
Doris 利用 “Segment 内 Key 列有序” 和 “分布式计算” 特性,将 TopK 拆分为 “局部裁剪” 和 “全局裁剪”:

例:10 个 BE 节点,K=10,局部裁剪后仅需传输 100 行数据到全局节点,全局排序 100 行即可,相比全量排序 10 亿行,开销可忽略不计。
多表 Join 是数据库的耗时操作,Doris 通过 “在 Probe 侧读取前,用 Build 侧数据生成过滤谓词”,减少 Probe 侧的数据量,核心是 “自适应谓词生成” 和 “谓词等待策略”。
Hash Join 分为 Build 侧(小表)和 Probe 侧(大表):
裁剪的关键是 “Probe 侧只读取可能匹配 Build 侧的数据”—— 即通过 Build 侧的 Join 列值,生成过滤谓词,提前排除 Probe 侧的不匹配行。
Doris 根据 Build 侧数据量,动态选择谓词类型:
In (v1, v2, ..., vn)谓词,Probe 侧用该谓词过滤,仅保留 Join 列在In列表中的行,过滤率 100%(无误判);

为什么用 Bloom Filter:当 Build 侧数据量极大(如 100 万行),生成 In 谓词的开销(存储、传输、解析)过高,而 Bloom Filter 体积小(如 100 万行仅需几 MB)、判断速度快,虽有误判但不影响正确性。
Bloom Filter/In 谓词的构建需要时间,若 Probe 侧一直等待,会增加查询延迟。Doris 采用 “1 秒等待策略”:
例:Build 侧构建 Bloom Filter 需 2 秒,Probe 侧前 1 秒读取的数据未过滤,但 1 秒后启用 Bloom Filter,过滤后续 80% 的数据,整体仍能大幅减少 Join 开销。
Doris 的四类数据裁剪机制,覆盖了从 “静态元数据筛选” 到 “动态执行优化” 的全链路,未来,Doris 社区将持续探索更通用的裁剪策略。
对于开发者而言,理解这些裁剪机制不仅能更好地编写高效 SQL(如优先用分区列 / Key 列做过滤),也能在排查性能问题时(如慢查询),快速定位 “是否因裁剪未生效导致全量扫描”—— 毕竟,在分析型数据库中,“不处理数据” 才是最快的处理方式。
往期推荐
Apache Doris 湖仓一体:打破数据边界,解锁实时分析的终极答案
Doris vs ClickHouse 企业级实时分析引擎怎么选?
完
●
数据极客圈子介绍
●
圈子1
Apache Doris社区是目前国内最活跃的开源社区(之一)。Apache Doris(Apache 顶级项目) 聚集了世界全国各地的用户与开发人员,致力于打造一个内容完整、持续成长的互联网开发者学习生态圈!
如果您对Apache Doris感兴趣,可以通过以下入口访问官方网站、社区论坛、GitHub和dev邮件组:
💡官网文档:https://doris.apache.org
💡社区论坛:https://ask.selectdb.com
💡GitHub:https://github.com/apache/doris
💡dev邮件组:dev@doris.apache.org
可以加作者微信(Faith_xzc)直接进Doris官方社区群
圈子2
PowerData是由一群数据从业人员,因为热爱凝聚在一起,以开源精神为基础,组成的数据开源社区。
社区群内会定期组织模拟面试、线上分享、行业研讨、线下Meetup、城市聚会、求职内推等活动,同时在社区群内你可以进行技术讨论、问题请教,结识更多志同道合的数据朋友。
社区整理了一份每日一题汇总及社区分享PPT,内容涵盖大数据组件、编程语言、数据结构与算法、企业真实面试题等各个领域,帮助您提升自我,成功上岸。
可以加作者微信(Faith_xzc)直接进PowrData官方社区群
叮咚✨ “数据极客圈” 向你敞开大门,走对圈子跟对人,行业大咖 “唠” 数据,实用锦囊天天有,就缺你咯!快快关注数据极客圈,共同成长!
点击上方公众号关注我们