
在企业 BI 建设中数据往往分散在 MySQL、PostgreSQL、ClickHouse、Hive 等多个异构数据源中。传统的跨源分析需要在 ETL 层将所有数据汇集到统一数仓——这带来了巨大的存储成本和数据延迟。衡石 HENGSHI SENSE 的「异构过滤」技术通过创新的三层架构设计在保持数据实时性的同时实现了跨源查询效率的质的飞跃。本文将深入拆解其技术原理与优化策略。一、跨源查询的经典困境企业中跨源查询有三种传统方案各有明显的局限性。方案一是全量 ETL 汇入统一数仓。将 MySQL 的交易数据、PostgreSQL 的客户数据、Hive 的行为日志通过 ETL 管道全部同步到 ClickHouse 数仓中再由 BI 统一查询。优点是查询速度快且统一管理但缺点也很突出存储成本高数据在多处冗余、数据延迟大T1 甚至更长、ETL 管道维护成本高、大表全量同步耗时长。方案二是联邦查询Federated Query。BI 查询引擎将查询分发到各数据源然后结果归并返回。优点是数据实时且无冗余存储但缺点明显每次查询都要跨网络访问多个数据源、大数据量归并时性能极差、各数据源的查询能力不均衡MySQL 聚合慢但 ClickHouse 聚合快木桶效应明显。方案三是数据虚拟化Data Virtualization。通过虚拟层提供逻辑统一视图将查询下推到各数据源执行。优点是逻辑统一且无需物理搬迁但跨源 JOIN 几乎不可行查询优化器难以全局优化复杂查询容易出错。典型的痛点场景是零售企业的订单在 MySQL 交易库客户标签在 PostgreSQL CRM 库转化数据在 ClickHouse 分析库。业务需要回答「上月华东区新增客户的首单转化率是多少」。传统方案需要先将 MySQL 和 PostgreSQL 数据同步到数仓至少 T1然后在数仓中完成 JOIN 和聚合总耗时至少一天。理想方案应该是在 PostgreSQL 中筛选华东区客户本地计算快速完成在 MySQL 中查询这些客户的首单本地计算快速完成在 ClickHouse 中做聚合计算本地计算快速完成最后在 BI 层归并结果秒级完成。二、衡石异构过滤三层架构衡石的解决方案采用了三层架构设计。第一层查询分解引擎Coordinator。负责将跨源查询拆解为多个单源子查询。以一个典型查询「按区域汇总 VIP 客户的月度销售额」为例查询分解引擎将原始查询分解为三步第一步在 PostgreSQLCRM 库中查询 VIP 客户 ID获得一个 ID 列表第二步将这个 ID 列表传递给 MySQL交易库在 MySQL 本地执行条件过滤和聚合计算第三步在协调层归并结果完成最终的分组汇总。关键优化策略是将大表 JOIN 转化为「小表筛选加 ID 列表传递加大表过滤查询」避免跨源传输大量原始数据。传统方案需要在协调层完成五千万行数据的 JOIN 操作而衡石方案将大部分计算下推到数据源本地完成协调层只需要处理聚合后的少量数据。第二层智能查询下推。每个数据源适配器会识别源数据库的查询能力将能下推的运算下推到数据源执行。查询下推的决策逻辑是WHERE 条件中单表字段可以下推到数据源跨表字段只能在协调层处理聚合函数中单表聚合可以下推到数据源跨表聚合只能在协调层处理JOIN 操作中同源 JOIN 下推到数据源小表 JOIN 大表小表小于一万行采用 ID 列表传递策略两个大表 JOIN 仍需要通过 ETL 汇入数仓ORDER BY 和 LIMIT 中单源排序下推到数据源跨源排序在协调层处理。第三层智能结果缓存。缓存策略根据查询特性动态选择频繁查询的维度组合主动缓存过滤条件变化大的查询不缓存历史数据长期缓存当日数据短期缓存或不缓存。三、跨源查询性能对比在典型测试环境MySQL 订单表 5000 万行PostgreSQL 客户表 200 万行ClickHouse 行为日志 2 亿行千兆内网下的性能对比如下。单表过滤查询传统全量 ETL 方案在数仓中需要 1.2 秒联邦查询在源库需要 0.8 秒衡石异构过滤通过源库加缓存仅需 0.5 秒。两表跨源关联小维度表加大事实表传统全量 ETL 不可用T1 延迟联邦查询需要 45 秒衡石异构过滤仅需 3.2 秒。三维度聚合两个数据源传统方案不可用联邦查询超 120 秒衡石仅需 8.5 秒。复杂报表三个数据源传统方案不可用联邦查询超时衡石仅需 15.3 秒。一个具体优化实例查询「华东区 VIP 客户的月度消费趋势」。优化前全量归并方案执行计划是 PostgreSQL 扫描 200 万客户后在协调层 JOIN MySQL 的 5000 万订单耗时 48 秒。优化后ID 列表传递加下推聚合方案执行计划变为三步PostgreSQL 筛选 VIP 客户 ID5456 条0.3 秒、MySQL 用 ID 列表过滤订单并本地聚合1.2 秒、协调层归并趋势0.1 秒总耗时仅 1.6 秒性能提升 30 倍。四、实战配置要点创建跨源数据集时需要指定数据集类型为跨源类型定义每个数据源的角色维度表还是事实表、关键字段和关联关系并选择关联策略ID 列表传递和缓存策略智能缓存。查询优化参数包括最大 ID 列表大小默认 10 万条超过上限时分片查询、优先下推策略能下推到数据源的运算尽量下推、并行查询数多数据源可并行查询提升效率、结果缓存有效期。跨源查询性能监控可以追踪以下指标总查询次数、平均响应时间、P95 响应时间、缓存命中率、下推率以及各数据源的平均响应时间和查询次数。五、异构过滤的适用边界适合的场景包括小维度表加大事实表的星型模型、不要求实时 JOIN 精确到每一行的场景允许 ID 列表近似、各数据源的查询延迟可以接受不超过 5 秒。不适合的场景包括两个均超千万行的大表 JOIN、要求行级精确关联如财务对账、数据源查询延迟过高超过 10 秒。对于这些场景仍建议通过 ETL 管道将数据汇入统一分析型数仓。最佳实践是采用分层数据架构热数据近 7 天通过异构过滤实时查询源库温数据近 3 个月通过异构过滤加缓存冷数据3 个月以前通过 ETL 汇入数仓做批量查询。这种策略在数据实时性和系统资源消耗之间取得了平衡。六、FAQQ1异构过滤和联邦查询的核心区别是什么联邦查询把 SQL 原样分发到各数据源执行结果是「各源并行查询但归并慢」。异构过滤的核心是「查询分解加 ID 列表传递加智能下推」把一个跨源大查询拆成多个小查询每个都能在源库高效完成。就像搬家——联邦查询是把所有家具先搬到一起再整理异构过滤是在每个房间就地分类打包。Q2ID 列表传递的列表长度有限制吗有。默认最大 10 万条。如果筛选出的 ID 超过这个数量列表会被分片每片 10 万分批查询后归并。如果 ID 列表超过 100 万建议将维度表同步到事实表所在的数据库避免 ID 传输成为瓶颈。Q3这种方案和 Data Mesh 的理念有冲突吗不冲突。异构过滤解决的是「技术层面的跨源查询」Data Mesh 关注的是「组织层面的数据所有权」。两者可以叠加使用——Data Mesh 定义数据所有权和接口标准异构过滤提供跨域查询的技术实现。结语异构数据关联是 BI 工程中最具挑战性的技术问题之一。衡石的异构过滤方案本质上是一种「用算法优化替代数据搬运」的思路——与其把所有数据搬到一起再分析不如让每个数据源做自己擅长的事在查询层做智能协调。这种思路不仅降低了对 ETL 管道的依赖也让 BI 查询的实时性大幅提升。