天天看点

citus对join的支持 citus对join的支持

citus对支持的SQL有一定的限制,其中包括最常见的join,具体如下

无限制。根据情况会以下面几种方式之一支持

亲和表

即2个表的分片规则完全相同,且join列即为分片列值

参考表

join的2个表中,其中有一个表不分片且每个worker上都存一份副本的表,即"参考表"

小表广播

分片数小于citus.large_table_shard_count的表被认为是小表(默认值为4),citus会将小表的分片广播到所有worker上并缓存。小表机制容易产生bug不建议使用,比如之后更新小表时不会更新缓存从而导致数据不一致,建议改用参考表代替。

数据重分布

使用task-tracker执行器可支持数据重分布,然后以MapMerge的方式支持。

与inner join的主要不同是不支持数据重分布,因此无法支持两个分片规则不一致的大表的outer join。 另外,参考表只有出现在left join的右边或right join的左边才被支持。

下面演示2个大表的join

CentOS release 6.5 x64物理机(16C/128G/3TB SSD)

PostgreSQL 9.6.2

citus 6.1.0

pgbouncer 1.7.2

master和worker都在1台机器上,端口号不同

master :60001

worker1:60002

worker2:60003

在master上添加worker节点

执行计划

默认的real-time执行器不支持这种join,先设置执行器为'task-tracker'

再执行SQL

16秒完成2个100w大表的join效率也不低了。

执行计划如下:

join列和分片列一致时可以支持

join列和分片列不一致时不支持

创建参考表tb3

参考表在left join右边时可以支持

参考表在left join左边时不支持

right join正好相反

full join不支持