查找 PostgreSQL 中两个大表之间的差异

问题描述 投票:0回答:4

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

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

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

sql postgresql left-join exists full-outer-join
4个回答
40
投票

EXISTS
似乎是最好的选择。

tbl1
是本例中具有多余行的表:

SELECT *
FROM   tbl1
WHERE  NOT EXISTS
       (SELECT 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;

稍后的文章中对基本技术的概述:

旁白:数据类型

uuid
对于 md5 哈希值来说是高效的:


7
投票

为了补充现有答案,我使用

row()
函数作为连接条件。这允许您比较整行。例如。我查看对称差异的典型查询如下所示

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

2
投票

如果您想在不知道哪个表比其他表有更多行的情况下找到差异,您可以尝试此选项来获取任一表中存在的所有行:

SELECT * FROM A
WHERE NOT EXISTS (SELECT * FROM B) 
  UNION
SELECT * FROM B
WHERE NOT EXISTS (SELECT * FROM A)

-2
投票

根据我的经验,子查询中的 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)

然后对另一张桌子进行同样的操作。

© www.soinside.com 2019 - 2024. All rights reserved.