找出PostgreSQL中两个大表之间的区别

时间:2013-03-11 02:46:22

标签: sql postgresql left-join exists full-outer-join

我在Postgres中有两个类似的表,只有一个32字节的拉丁字段(简单的md5哈希)。 两个表都有~30,000,000行。表没有什么区别(10-1000行不同)

Postgres是否可以找到这些表之间的差异,结果应该是我上面描述的10-1000行。

这不是一个真正的任务,我只是想知道PostgreSQL如何处理类似JOIN的逻辑。

3 个答案:

答案 0 :(得分:25)

最佳选择可能是EXISTS反半连接:

tbl1是此示例中具有剩余行的表:

SELECT *
FROM   tbl1
WHERE  NOT EXISTS (SELECT 1 FROM tbl2 WHERE tbl2.col = tbl1.col);

如果您不知道哪个表有剩余行或两者都有,可以在切换表名后重复上述查询,或者:

SELECT *
FROM   tbl1
FULL   OUTER JOIN tbl2 USING (col)
WHERE  tbl2 col IS NULL OR
       tbl1.col IS NULL;

后期帖子中的基本技术概述:

顺便说一下,对于md5哈希值使用uuid列会更加高效

答案 1 :(得分:2)

为了扩充现有答案,我使用row()函数作为连接条件。这允许您比较整个行。例如。我看到对称差异的典型查询看起来像这样

select *
from tbl1
full outer join tbl2 
    on row(tbl1) = row(tbl2)
where tbl1.col is null
or    tbl2.col is null

答案 2 :(得分:-1)

根据我的经验,NOT IN与子查询需要很长时间。我是通过包容性加入来实现的:

DELETE FROM table1 where ID IN (
SELECT id FROM table1
LEFT OUTER JOIN table2 on table1.hashfield = table2.hashfield
WHERE table2.hashfield IS NULL)

然后以另一种方式对另一张表做同样的事情。