我在Postgres中有两个类似的表,只有一个32字节的拉丁字段(简单的md5哈希)。 两个表都有~30,000,000行。表没有什么区别(10-1000行不同)
Postgres是否可以找到这些表之间的差异,结果应该是我上面描述的10-1000行。
这不是一个真正的任务,我只是想知道PostgreSQL如何处理类似JOIN的逻辑。
答案 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)
然后以另一种方式对另一张表做同样的事情。