Apache Doris 是一款开源的 MPP 数据库,以其优异的分析性能著称,被各行各业广泛应用在实时数据分析、湖仓融合分析、日志与可观测性分析、湖仓构建等场景。Apache Doris 目前被 5000 多家中大型的企业深度应用在生产系统中,包含互联网、金融、制造、电信、能源、物流、政务等行业。目前项目已在 GitHub 获得超过 13000 Star,汇集 600 多名社区开发者,月度活跃贡献者数量连续数月位居全球大数据开源项目榜首,成为全球大数据领域最活跃的开源项目之一。

SelectDB 是北京飞轮数据科技有限公司基于 Apache Doris 研发的现代化实时数据仓库,提供包括面向私有化部署的 SelectDB Enterprise 和云原生存算分离的 SelectDB Cloud 云数仓服务。SelectDB 兼容 Apache Doris 的所有能力和接口,相比开源自建在安全、稳定、资源弹性等方面有明显优势。本文将对 Doris & SelectDB 适合的分析场景和技术能力进行概述解析。

SelectDB 与 Doris 在如下的分析场景中通常是最优选择:
Doris & SelectDB 的查询分析性能非常优异,在宽表聚合分析和复杂多表关联场景中均表现突出:
Doris & SelectDB 如此卓越的性能主要得益于以下技术加持:
Doris & SelectDB 默认使用列式存储组织数据,在数据分析场景下,相比行存储通常有 5-10 倍的性能提升,这是因为:

Doris & SelectDB 支持丰富的索引机制,通过索引机制,可以大幅减少对不相关数据的读取和处理,从而能够大幅提升性能。从加速的查询和原理来看,Doris & SelectDB 的索引分为点查索引和跳数索引两大类。
点查索引:常用于加速点查。 其原理是通过索引定位到满足 WHERE 条件的位置,直接读取其所在行。点查索引在满足条件的行数较少时,效果尤为显著。其点查索引包括前缀索引和倒排索引。
前缀索引:按照排序键以有序的方式存储数据,并每隔 1024 行数据创建一个稀疏前缀索引。索引中的 Key 是当前 1024 行中第一行中排序列的值。如果查询涉及已排序列,系统将找到相关 1024 行组的第一行,并从该行开始扫描。
倒排索引:对创建了倒排索引的列,建立每个值到对应行号集合的倒排表。对于等值查询,先从倒排表中查到行号集合,然后直接读取对应行的数据,而无需逐行扫描匹配数据,从而减少 I/O 、加速查询。倒排索引还能加速范围过滤、文本关键词匹配,算法更加复杂但基本原理类似。

跳数索引:常用于加速分析。 原理是通过索引确定不满足 WHERE 条件的数据块,跳过这些不满足条件的数据块,只读取可能满足条件的数据块并再进行一次逐行过滤,最终得到满足条件的行。跳数索引在满足条件的行比较多时效果较好。其跳数索引包括 ZoneMap 索引、BloomFilter 索引、NGram BloomFilter 索引。
ZoneMap 索引:自动维护每一列的统计信息,为每一个数据文件(Segment)和数据块(Page)记录最大值、最小值、是否有 NULL、Sum。对于等值查询、范围查询、IS NULL,可以通过最大值、最小值、是否有 NULL 来判断数据文件和数据块是否可以包含满足条件的数据,如果没有则跳过不读对应的文件或数据块减少 I/O 加速查询。比如下方 SQL 所示,有一个过滤条件 a<='100101',总共有三个数据块,第一个数据块通过读 ZoneMap 索引发现,最大值是 100101,整个数据块都满足条件,那么直接从 ZoneMap 中取得 sum 结果作为第一个数据块的聚合结果,不需要读取和解压数据块。而第三个数据块 ZoneMap 记录的最小值都不满足过滤条件,所以第三个数据块直接排除。最终只需要解压、过滤和聚合第二个数据块。

BloomFilter 索引:将索引对应列的可能取值存入 BloomFilter 数据结构中,它可以快速判断一个值是否在 BloomFilter 里面,并且 BloomFilter 存储空间占用很低。对于等值查询,如果判断这个值不在 BloomFilter 里面,就可以跳过对应的数据文件或者数据块减少 I/O 加速查询。
NGram BloomFilter 索引:用于加速文本 LIKE 查询,基本原理与 BloomFilter 索引类似,只是存入 BloomFilter 的不是原始文本的值,而是对文本进行 NGram 分词,每个词作为值存入 BloomFilter。对于 LIKE 查询,将 LIKE 的 pattern 也进行 NGram 分词,判断每个词是否在 BloomFilter 中,如果某个词不在,则对应的数据文件或者数据块就不满足 LIKE 条件,可以跳过这部分数据减少 I/O 加速查询。

Doris & SelectDB 采用大规模并行处理(MPP)架构,一个 SQL 会被拆分成多个执行分片,分发到不同的机器上并行执行,节点内还支持多核的并行执行,将集群资源利用最大化。对于多张大表的 Join 操作,能够通过 Shuffle 机制将数据打散到多个节点上进行,从而有效应对复杂查询。

Doris & SelectDB 查询引擎是向量化引擎,所有内存结构均按列式布局。它一次处理一批数据,而非逐条处理,可显著减少虚函数调用、提高缓存命中率,并有效利用 SIMD 指令、充分采用延迟物化技术,进一步优化性能。比如下面一条 SQL ,左侧是传统的逐行处理的火山模型引擎,右侧是 Doris & SelectDB 纯向量化 + 延迟物化处理引擎,一次处理一个批量,在拼算子性能的宽表聚合场景下,向量化引擎带来的性能提升多达 5-10 倍。

采用 Pipeline 执行机制,该技术主要通过减少阻塞,数据流驱动的方式,以高并发原理充分提高查询和数据处理的效率。其核心思想是将复杂的查询或数据处理任务分解为多个阶段或操作(称为 PipeLine Task),每个阶段负责处理数据的某个特定部分,例如过滤、投影、聚合或排序,通过并行或重叠执行这些步骤来加速整体处理过程。

Pipeline 执行模型通过阻塞逻辑将执行计划拆解成 Pipeline Task,将 Pipeline Task 分时调度到线程池中,实现了阻塞操作的异步化,解决了 Instance 长期占用单一线程的问题。同时,可以采用不同的调度策略,实现 CPU 资源在大小查询间、不同租户间的分配,从而更加灵活地管理系统资源。Pipeline 执行模型还采用了数据池化技术,将单个数据分桶中的数据进行池化和重分布,从而解除分桶数对 Instance 数量的限制,提高其对多核系统的利用能力,同时避免了线程频繁创建和销毁的问题,提高了系统的并发性能和稳定性。

Doris & SelectDB 采用 Cascades + Dphyper 混合智能枚举框架,优化大规模查询计划,并结合基于规则的和基于代价的查询改写、函数依赖优化及分布式执行优化,提升查询性能。同时,通过精准统计信息与动态调优,增强对业务场景的适配性,确保高效查询执行。

在数据分析中,物化视图采用空间换时间的策略,提供了有效的查询加速方案,兼具视图的灵活性和物理表的高性能。它可以预先计算并存储查询结果集,从而在查询请求到达时直接从物化视图中获取结果,而无需重新执行查询语句。这种机制有效提升了查询性能,降低了重复执行查询的开销。
Doris & SelectDB 支持两种物化视图:同步物化视图和异步物化视图。 前者能够保持物化视图和基表数据同步一致,但只支持单表,适合单表聚合查询的分析加速。后者能够支持多表以及复杂查询,但是物化视图更新滞后于基表(两者最终一致),并支持对多表物化视图的手动刷新和按照分区级别增量自动更新。下面对其物化视图特性和适用场景的总结:

缓存技术是有效的加速手段,Doris & SelectDB 支持多级缓存机制:SQL 的最终结果、聚合结果缓存、原始数据缓存、存算分离和数据湖分析场景下的本地文件缓存。通过多级缓存机制,能够最大程度实现数据的复用,减少不必要的执行和 IO,最大化系统性能。
**Doris & SelectDB 支持两层数据划分:分区和分桶。**通过分区分桶机制能够有效将数据和负载划分到多个节点上,以提升系统的扩展性和并行处理能力,与此同时也有利于对查询进行分区分桶裁剪,减少非必要的数据扫描,从而提升系统的性能和高并发处理的能力。如下图所示,以下查询通过分区键 day裁剪掉不相关分区,通过分桶键id裁剪掉不相关分桶。
SELECT * FROM user_table
WHERE id = 5122 and day = '2022-01-01';

Doris & SelectDB 支持多种表模型,其中聚合模型是一种表模型,允许用户在建表时指定聚合键(Aggregate Key)和聚合函数。在数据导入过程中,会根据聚合键对数据进行分组,并对每个分组应用指定的聚合函数进行预聚合。预聚合后的结果会被存储,查询时可以直接使用这些结果,而无需在运行时扫描和计算原始数据,从而优化查询性能。这一技术通常被应用在一些指标分析的场景中。

在高并发点查的 DataServing 场景,Doris & SelectDB 特别做了几项优化,使得高并发点查的单节点 QPS 提升到万级别,并且可以随着节点数线性扩展,具体来说:
数据从产生到能够进入到 Doris & SelectDB 进行分析的实时性要求越来越高,尤其是在电商实时大屏、物联网设备监控、金融分控系统等业务中。其提供了多种实时数据导入的机制,并且也在持续优化底层技术,来达到更好的时效性和并发吞吐。
此外,还支持通过 JDBC INSERT 方式实时写入数据,但该方式吞吐不优并不推荐。对于大批量数据写入和高吞吐场景支持其他机制,包括通过数据湖 Insert Into Select 方式或 Broker Load 方式,来批量导入 HDFS 或对象存储上的数据。
为保障实时导入效率,其进行了多项技术创新:
在实时数据仓库的业务场景中,支持数据的实时更新是核心能力之一。例如在数据库同步(CDC)、电商交易订单、广告效果投放、营销业务报表等业务场景中,面对上游数据的变化,通常需要快速获取到变更记录并针对单行或多行数据进行及时变更,保证业务分析师及相关分析平台能快速捕捉到最新进展,提升业务决策的及时性。
传统的大数据分析系统解决这类问题通常比较吃力,很多系统只能做到分区级别的更新。Doris & SelectDB 针对实时数据更新做了系统性优化,相比于传统的 Merge-on-Read 或者 Copy-on-Write 的方案,Doris & SelectDB 采用的 Merge-on-Write 的方案使用记录删除标记和更新增量的方式,在查询性能和更新性能方面取得了最佳平衡。

除了整行更新的模式,Doris & SelectDB 也支持部分列更新的模式,进一步优化了使用体验。
云计算基础设施的成熟带来了许多独有的优势,例如可根据需要快速增加或减少资源,无需担心基础设施的限制,只需为实际使用付费;又如提供了灵活多样的存储介质,可针对实际需求配置不同性能、不同价格的存储。SelectDB Cloud 采用存算分离模式,将计算资源和存储资源分开管理,从而更好地发挥云计算平台的强大功能。 此外,Apache Doris 及 SelectDB Enterprise 在 3.0 版本开始也支持了存算分离架构。

在存算分离的架构中,数据需要从远端共享存储系统中读取,是否会对查询性能造成影响是客户普遍关注的问题。为了加速数据访问,Doris & SelectDB 实现了基于本地磁盘的高速缓存机制,并提供 LRU 和 TTL 两种高效的缓存管理策略,并对索引相关的数据进行了优化,旨在最大程度上缓存用户常用数据、提升查询性能,并且能够在多 Cluster 之间推送缓存,实现主动预热。在实际的评测中,只要缓存配比合理,性能并未明显降低。即使在没有 Cache 完全从对象存储冷读的场景下,性能损失也只有 35%左右,相比业界同类系统有显著优势。

除了将数据导入到 Doris & SelectDB 内进行高效分析外,Doris & SelectDB 还可以当做一个湖仓的计算和查询(Data Lakehouse Compute & Query Engine)直接对位于 Data Lakehouse、数据库、离线数据仓库中的数据进行计算和查询,在不进行数据移动的情况下,打通湖仓和数据库的边界,实现统一的查询加速和多源联邦分析,达到数据无界、湖仓融合的效果。

Doris & SelectDB 通过 Multi-Catalog 和 可扩展的连接器框架,支持主流数据系统和数据格式,并提供基于 SQL 的统一数据分析能力,用户能够在不改变现有数据架构的情况下,轻松实现跨平台的数据查询与分析。

得益于上面提到的各种极速查询的技术,当使用 Doris & SelectDB 作为湖仓计算和查询引擎的时候,相比 Presto、Trino、SparkSQL、Hive 等引擎,通常有数倍的性能提升,如下所示,在基于 Iceberg 表格式的 1TB 的 TPCDS 标准测试集上,其执行 99 个查询的总体运行耗时仅为 Trino 的 1/3。

实际用户场景中,在使用一半资源的情况下,相比 Presto 平均查询延迟降低了 20%,95 分位延迟更是降低 50%,达到了降本增效的目的。

在企业整合多个数据源并实现湖仓一体转型的过程中,迁移业务的 SQL 查询到 Doris & SelectDB 是一项挑战,因为不同系统的 SQL 方言在语法和函数支持上存在差异。若没有合适的迁移方案,业务侧可能需要进行大量改造以适应新系统的 SQL 语法。
为了解决这个问题,Doris & SelectDB 提供了 SQL 转换服务,允许用户直接使用其他系统的 SQL 方言进行数据查询。转换服务会将这些 SQL 方言转换为 Doris & SelectDB SQL,极大降低了用户的迁移成本。目前,已支持 Presto/Trino、Hive、PostgreSQL 和 Clickhouse 等常见查询引擎的 SQL 方言转换,在某些实际用户场景中,兼容率可达到 99%以上。
数据分层建模,ODS 层在 LakeHouse 中,DWD,DWS,ADS 层的数据加工和数据服务在 Doris & SelectDB 中,充分利用其性能优势,此外还可以将其加工好的数据再通过 Write-Back 的机制写回到 LakeHouse 中,实现备份归档或者供其他的数据系统继续处理使用。

现代化的数据分析系统,除了能够高效的处理结构化的数据,也应该能够高效的存储和处理半结构化数据和非结构化数据:
JSON 格式数据的处理面临如下几个挑战:
业界惯常的做法是将 JSON 存储成 String,并且支持丰富的处理函数,这种方案能够解决灵活 Schema 的问题,但是存储和分析效率都非常低。
为此,推出了 VARIANT 数据类型,VARIANT 数据类型可以存储任何合法的 JSON,可自动从 JSON 中抽取字段并推断其类型;并将这些字段存储为 VARIANT 列的子列,这些子列以列存的方式存储,能够高效压缩存储;这种列式存储方式使得 VARIANT 具备很好的分析性能,当进行聚合/过滤/排序等查询时,只需要读取 VARIANT 子列数据即可,不会产生额外的数据解析开销,查询性能可获得数量级的提升。VARIANT 的方案使得半结构化数据处理效率逼近结构化数据,同时又满足了灵活性的目的。

日志、Trace、Metrics 是最典型的 JSON 格式半结构化数据,而这些数据是可观测性分析的主要内容。这类数据具有高写入吞吐、海量存储和实时响应需求,所以需要一个高性价的方案。

通过一系列的技术优化,使得在 Log Trace 相对于 ElasticSearch 写入性能 3~5 倍,80% 存储空间降低,查询性能 2~3 倍;相对 CK 查询性能 3 倍。Metrics 相对于 TimescaleDB InfluxDB 写入性能 5~7 倍,查询性能 2~6 倍。


Doris & SelectDB 以其极速、实时、云原生、湖仓融合、高效多模数据分析的优秀能力,使得其成为实时数据分析、湖仓融合分析、可观测性与日志分析、数仓构建的最佳选择。安踏、长安汽车、顺丰科技、特步、中通快递、趣丸科技、MINISO、MiniMax、观测云、迅雷、新东方、星火保等众多客户基于 Doris & SelectDB 构建了高效的数据分析平台。未来,将持续提升其弹性的能力、批量处理能力、增量流式处理能力、面向大模型 GenAI 的混合检索能力。
如果您对 Doris & SelectDB 感兴趣,欢迎下载体验。
此外,如果你想获得即时沟通,反馈/了解产品更多信息,也可扫描下方二维码咨询/交流。
