微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Citus分布式表中的非分布式列上使用联接

如何解决在Citus分布式表中的非分布式列上使用联接

我成功地创建了一个带有几个工作节点的Citus集群。使用分布式表运行查询时出现问题。

这是我要运行的指示性查询的非常简化的版本:

SELECT a.origin,a.destination,b.label AS origin_label,c.label AS destination_label
FROM commuting_data a
LEFT JOIN geography_data b ON a.origin=b.sequence_id
LEFT JOIN geography_data c ON a.destination=c.sequence_id
ORDER BY a.origin,a.destination

commuting_data由大约2000万行组成,除其他信息外,每行还包含源代码和目标代码。 geography_data包含约10万行,并包含有关commuting_data表中包含的每个地理代码的信息。

geography_data中的sequence_id列与原始列和目标列匹配,并提供有关这些空间点的标签和其他信息。我想将commuting_data加入到原始列和目标列上的geography_data表中。在单节点Postgresql数据库中很容易做到这一点,但是完成查询很慢。

我的问题是Citus每个表仅支持一个分配列。因此,如果将表commuting_data的分布列设置为“原始”或“目的地”,则会出现错误“仅当所有分布表在其分布列上并置并连接时才支持复杂联接”。

我如何克服这个问题,并利用Citus可以提供的所有数据库分片功能来产生上述查询给出的结果?

我在Ubuntu 20.04上将Postgresql 12.4和Citus 9.4一起使用。

解决方法

Citus无法以分布式方式执行查询,因为查询会在非分布列上执行LEFT JOIN。

如果对您来说不算太多,您可以将geography_data的非分布列包装在cte中,并在查询中使用它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。