Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在两个大的postgreSQL表上批量运行外部联接?_Java_Postgresql_Batch Processing_Outer Join - Fatal编程技术网

Java 如何在两个大的postgreSQL表上批量运行外部联接?

Java 如何在两个大的postgreSQL表上批量运行外部联接?,java,postgresql,batch-processing,outer-join,Java,Postgresql,Batch Processing,Outer Join,我有两张有数百万行的桌子。他们共享一个共同的电子邮件地址。它们不共享任何其他字段 我有一个连接操作,运行良好 select r.*,l.* from righttable r full outer join lefttable l on r.email=l.email 但是,结果集包含数百万行,这会占用服务器的内存。如何运行一次只能从每个表中提取有限行数的连续查询,并最终访问两个表中的所有行 此外,在收到结果集后,我们的服务器可能会向一个或两个表中插入一些内容。恐怕这会使跟踪每个连续查询中的

我有两张有数百万行的桌子。他们共享一个共同的电子邮件地址。它们不共享任何其他字段

我有一个连接操作,运行良好

select r.*,l.* from righttable r full outer join lefttable l on r.email=l.email 
但是,结果集包含数百万行,这会占用服务器的内存。如何运行一次只能从每个表中提取有限行数的连续查询,并最终访问两个表中的所有行


此外,在收到结果集后,我们的服务器可能会向一个或两个表中插入一些内容。恐怕这会使跟踪每个连续查询中的偏移量变得复杂。也许这不是问题。我不能把我的头绕在它身上。

我认为你不能成批地做这件事,因为它不知道要制造什么行来完成“完整的外部”,而不看到所有的数据。如果您知道在您工作时没有人对表进行更改,那么您可以通过在单独的查询中选择仅左元组、仅右元组和内部元组来避免这种情况

但是,它不应该消耗服务器上的所有内存(假设您指的是RAM,而不是磁盘空间),因为它应该使用临时文件而不是RAM来存储所需的大部分存储(尽管对于大型哈希联接,内存使用存在一些问题,所以您可以尝试
将enable\u hashjoin=off


客户机可能会使用太多内存,因为它可能会尝试一次性将整个结果集读取到客户机RAM中。有很多方法可以解决这个问题,但它们可能不涉及操纵联接本身。您可以使用光标从单个结果流中批量读取,也可以使用\copy将结果输出到磁盘,然后在其上使用类似GNU
split
的内容。

如果您想要内部联接,我会有一个很好的答案……您之前的答案(我看到您已删除)建议使用like子句。我明白这是怎么回事了。正如我想象的那样,您在发布后考虑到的,只有当电子邮件以“a”开头的行数与电子邮件以“b”开头的行数大致相同时,这才适用于所有其他信件。但这并不能保证,如果碰巧是这样,查询可能仍然返回太多的结果,服务器无法处理。不,我删除答案的原因是它不适用于外部联接。确切的
LIKE
条件可以改变以获得相等的分区,这不是一个基本问题。