我有两个包含数百万行的表。他们共享一个共同的电子邮件地址。他们不共享任何其他字段。
我有一个工作正常的连接操作。
select r.*,l.* from righttable r full outer join lefttable l on r.email=l.email
但是,结果集包含数百万行,这使我的服务器内存不堪重负。我如何运行连续查询,一次只从每个表中提取有限数量的行,并最终访问两个表中的所有行?
此外,在收到结果集后,我们的服务器可能会对一个或两个表进行一些插入。恐怕这可能会使跟踪每个连续查询中的偏移量变得复杂。也许这不是问题。我无法理解它。
最佳答案
我认为您不能分批执行此操作,因为它不会知道要在没有看到所有数据的情况下制作哪些行来满足“FULL OUTER”。如果您知道在您工作时没有人对表进行更改,您可以通过在单独的查询中选择仅左元组、仅右元组和内部元组来解决这个问题。
但是,它不应该消耗服务器上的所有内存(假设您指的是 RAM,而不是磁盘空间),因为它应该使用临时文件而不是 RAM 来满足所需的大部分存储(尽管内存存在一些问题)用于大型散列连接,因此您可以尝试 set enable_hashjoin=off
)。
客户端可能会使用太多内存,因为它可能会尝试一次将整个结果集读入客户端 RAM。有很多方法可以解决这个问题,但它们可能不涉及操纵 JOIN 本身。您可以使用游标从单个结果流中批量读取,或者您可以使用\copy 将结果假脱机到磁盘,然后我们在上面使用类似 GNU split
的东西。
关于java - 如何批量对两个postgreSQL 大表进行外连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62421450/