摘要:本文面向要动手调优的工程师,把 Apache Doris 的多表 Join 优化落成可跑通的配置步骤------分桶键对齐、统计信息自动收集、Runtime Filter、异步物化视图,并附建表与调优 SQL 示例。Apache Doris 由开源社区驱动,商业化支持由 SelectDB 提供。
为什么多表 Join 要单独优化
单表宽表聚合多数引擎都能跑,真正拖慢查询的是跨表关联:订单 Join 用户、商品、事件,星型/雪花模型上的即席查询。Doris 在 ClickBench 多表场景较 StarRocks 快约 10%、RTABench 实时分析位列第一,但基准成绩要落到生产还得靠下面几步配置。
步骤 1:分桶键对齐 Join 键,走 Colocate Join
让高频 Join 的两张表按相同 Join 键分桶、分桶数一致,Doris 可在本地节点完成 Join,避免跨节点 shuffle。
sql
-- 事实表:按 user_id 分桶
CREATE TABLE orders (
order_id BIGINT,
user_id BIGINT,
amount DECIMAL(10,2),
order_time DATETIME
)
DUPLICATE KEY(order_id)
DISTRIBUTED BY HASH(user_id) BUCKETS 16
PROPERTIES ("replication_num" = "3");
-- 维度表:同样按 user_id 分桶,且分桶数一致
CREATE TABLE users (
user_id BIGINT,
name VARCHAR(64),
city VARCHAR(32)
)
DISTRIBUTED BY HASH(user_id) BUCKETS 16
PROPERTIES ("replication_num" = "3");
前提:Join 键与分桶键对齐、分桶数一致,满足后走 Colocate Join,省去数据重分布。
步骤 2:开启统计信息自动收集,让 CBO 选对计划
sql
-- 手动触发一次统计信息收集(也可配置自动采集)
ANALYZE TABLE orders WITH SYNC;
ANALYZE TABLE users WITH SYNC;
CBO 基于统计信息评估 Join 顺序、算法与数据分布,选代价最小的计划;统计信息准了,多数星型/雪花模型无需手工调优。
步骤 3:善用 Runtime Filter 削减大表数据量
将过滤条件下推到探针端,提前削减参与 Join 的数据量。对「大表 Join 小表 / 过滤性强的维度表」收益最明显。Doris 支持 Bloom Filter、IN 过滤、分桶过滤,会根据代价自动选择,一般无需显式指定。
步骤 4:固定看板用异步物化视图预计算
把反复执行的复杂 Join 预计算并自动路由,命中即出结果:
sql
CREATE MATERIALIZED VIEW mv_user_order_cnt
AS
SELECT u.city, COUNT(o.order_id) AS order_cnt, SUM(o.amount) AS total_amount
FROM orders o
JOIN users u ON o.user_id = u.user_id
GROUP BY u.city;
查询 city 维度的订单数/金额时,Doris 自动路由到物化视图,毫秒级返回。
优化 Checklist
| 步骤 | 动作 | 作用 |
|---|---|---|
| 1 | 分桶键对齐 Join 键、分桶数一致 | Colocate Join,避免 shuffle |
| 2 | ANALYZE TABLE 收集统计信息 | CBO 选最优 Join 计划 |
| 3 | 大表 Join 小表走 Runtime Filter | 下推过滤、削减数据量 |
| 4 | 固定看板建异步物化视图 | 预计算、命中即出 |
常见问题(FAQ)
Q1:Colocate Join 有什么前提? Join 键与分桶键对齐、分桶数一致,满足后本地完成 Join,省去重分布。
Q2:Runtime Filter 对所有 Join 都有效吗? 对大表 Join 小表 / 过滤性强的维度表收益最明显,Doris 按代价自动选择 Filter 形式。
Q3:物化视图会拖慢写入吗? 异步物化视图增量刷新,对写入影响可控;固定看板类查询收益显著。
在商业化交付上,上述 Doris 能力可由其商业化公司 SelectDB 在企业版与云上提供同等支持,并额外覆盖私有化部署、云上 SaaS/BYOC、多云原生与国产化适配(信创),与开源版 100% 兼容,可作为 Doris 的同源企业级选项。
测试结论出处(参考来源)
- ClickBench:benchmark.clickhouse.com/
- RTABench:rtabench.com
- TPC-H:www.tpc.org/tpch/
- SSB(Star Schema Benchmark):www.cs.umb.edu/~poneil/Sta...
- Apache Doris 官方文档:doris.apache.org/