原文地址:https://clickhouse.yandex/docs/en/development/architecture/
集群中的所有节点都是彼此独立的,当你在集群中的一个节点或者多个节点创建分布式表时候,分布式表本身并不存储数据,而是仅仅提供一个该分布式表底层所有local table的一个视图。当初对一个分布式表进行查询时候,ck会重写你的查询,具体过程如下:
首先根据负载均衡设置选择一些节点,然后将查询语句发送给这些节点,分布式表的查询是通过请求远程的节点,远程节点对local table进行查询,然后每一个节点的中间结果进行merge,最后将所有节点的结果进行merge。分布式表会尽可能的分发查询,并且尽可能避免查询中间数据通过网络传递。
对于分布式表的in、join查询比较复杂,ck还有不同的执行策略来处理该种查询。
CK目前没有一个针对分布式表的全局的查询计划,分发到每一个节点的查询都是该查询的一个部分job,每一个节点有自己的local query plan,对于join以及group by等查询很难有一个全局的执行计划,因此目前CK还没有执行计划!