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

odi*_*apc 10 sql postgresql exists left-join full-outer-join

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

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

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

Erw*_*ter 26

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

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

SELECT *
FROM   tbl1
WHERE  NOT EXISTS (SELECT 1 FROM tbl2 WHERE tbl2.col = tbl1.col);
Run Code Online (Sandbox Code Playgroud)

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

SELECT *
FROM   tbl1
FULL   OUTER JOIN tbl2 USING (col)
WHERE  tbl2 col IS NULL OR
       tbl1.col IS NULL;
Run Code Online (Sandbox Code Playgroud)

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

顺便说一句,使用md5哈希列的效率要高得多uuid:


Tho*_*asH 6

为了补充现有答案,我使用row()连接条件函数。这允许您比较整行。例如,我查看对称差异的典型查询如下所示

select *
from tbl1
full outer join tbl2 
    on row(tbl1) = row(tbl2)
where tbl1.col is null
or    tbl2.col is null
Run Code Online (Sandbox Code Playgroud)