首页/数据/NoSQL 速查/Distributed 分布式表
ClickHouse56 条

Distributed 分布式表

Distributed 引擎本身不存数据,负责把查询转发到集群各分片并把结果汇总:建表参数为集群名、库名、本地表名与可选分片键。

NoSQL 速查数据更新于 2026-10-13

Distributed 引擎是什么

Distributed 引擎本身不存数据,它把查询转发到集群各分片并把结果汇总,写入时按分片键把数据路由到本地表。建表参数是集群名、库名、本地表名与可选分片键。查询分布式表会扇出到所有分片,聚合在发起查询的节点二次汇总,因此它适合跨分片统计,而单分片明细查询直接查本地表更省资源。

基本信息

语法ENGINE = Distributed(cluster, database, local_table[, sharding_key])
写入直接写入分布式表时按分片键路由,无分片键则随机分布
查询SELECT 扇出到所有分片,聚合在发起节点二次汇总
前提集群配置中需定义该集群与各分片副本
配套本地表通常用 ReplicatedMergeTree 保证副本
适用版本ClickHouse 全系列

典型使用场景

  • 跨分片统计:全量计数、按维度汇总
  • 写入入口统一:业务只写分布式表,由集群负责路由
  • 分片拆分:按 user_id 哈希把数据打散
  • 报表查询:跨分片聚合后统一返回
  • 本地明细查询:统计分析走分布式表,明细走本地表
  • 集群扩容后重新平衡数据时作为查询入口保持不变

示例

示例
CREATE TABLE events_all ON CLUSTER prod AS events_local
ENGINE = Distributed('prod', 'analytics', 'events_local', rand());   -- 随机分片

-- 按用户哈希分片,保证同一用户的数据落在同一分片
-- ENGINE = Distributed('prod', 'analytics', 'events_local', cityHash64(user_id));

SELECT count() FROM events_all;                          -- 跨分片统计
SELECT * FROM events_all WHERE user_id = 42 LIMIT 10;     -- 带分片键可定位单分片

参数与行为读法

项含义注意点
cluster集群名称需在配置中已定义
database本地表所在库各分片需一致
local_table本地实体表名通常为 Replicated 表
sharding_key分片路由表达式决定数据分布是否均衡
无分片键随机或轮询写入查询无法定位单分片
生产上通常查询分布式表做跨分片统计,对单分片明细或后台任务则直接查本地表更省资源,也避免无谓的扇出。
写入分布式表与写入本地表都会落数据,选择哪种写入方式要统一,避免同一份数据被双份写入造成重复统计。
分片键选错会造成数据倾斜:写入量与查询负载集中到个别分片,扩容也难以缓解。

易错点

  • 分布式表行数与本地表是求和关系,统计时不要把两者重复计算
  • 分片键选错会造成数据倾斜,写入与查询集中到个别分片
  • 不带分片键的查询会扇出到所有分片,单条明细查询的成本被成倍放大
  • 本地表结构与分布式表定义不一致会导致写入或查询报错,建表要成对维护
  • 把分布式表当存储层管理生命周期(如直接改结构)会失败,结构变更要在本地表上做并保持各分片一致

数据来源与参考

  • ClickHouse Docs: Distributed engine
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌