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不支持