Citus分布式表的查询处理
查询分布式表功能介绍
聚合函数
Citus支持并行化PostgreSQL支持的大多数聚合函数。Citus的查询规划器将聚合转换为其可交换和关联形式。在此过程中,在Work的分片上运行聚合查询,然后协调器将Work的结果组合在一起以生成最终结果进行输出。
计数(count distinct)聚合
Citus支持多种计数(distinct)聚合。如果计数在分发列上,Citus可以直接将查询下推到Work。如果没有,Citus会在每个worker上运行select distinct语句,并将结果返回给协调器,在协调器中获取最终计数。
当Worker拥有更多不同的计算列,要传输这些数据到协调器会使计算变慢(推荐使用HyperLogLog)。
例如:
SELECT count(distinct a ), count(distinct b ), count(distinct c )
FROM table_abc
重新分区
在某些情况下,您可能需要在分发列以外的列上连接两个表。对于这种情况,Citus还允许通过动态地为查询重新分区以进行支持。
在这种情况下,要重新分区的表由查询优化器根据分发列,连接键和表的大小来确定。使用重新分区表,可以确保只有相关的分片进行连接,从而大大减少了通过网络传输的数据量。
参考表
由于参考表在所有工作节点上完全复制,因此可以在Worker进行本地连接并且可以并行执行。因为参考表不分布在任何特定列上,可以更自由的使用。
共址表连接
对于共址表,可以在其公共分布列上高效地连接。共址表的连接是连接两个大型分布式表的最有效方式。
join
Citus支持任意数量的表之间的equi-JOIN,无论其大小和分配方法如何。查询计划程序根据表的分布方式选择最佳连接方法和连接顺序。它评估几个可能的连接顺序,并创建一个连接计划,该计划要求通过网络传输最少的数据。
分布式表的视图
Citus支持分布式表的所有视图
Citus也支持物化视图
,并将它们作为本地表存储在协调器
节点上。
条件下推
Citus还尽可能地将限制条件下放到Worker的分片上,以最大限度地减少通过网络传输的数据量。
TOP-N,HyperLogLog
Citus支持该插件,详见其他文章。
[CitusDB中国]站主,PostgreSQL粉丝,现从事Citus研发工作
愿Citus在中国发展的越来越好