2013-03-11 123 views
8

我在Postgres中有兩個類似的表,只有一個32字節的拉丁字段(簡單md5哈希)。 兩個表都有〜30,000,000行。表格差別不大(10-1000行不同)在PostgreSQL中查找兩個大表之間的差異

Postgres是否可以找到這些表格之間的差異,結果應該是我上面描述的10-1000行。

這不是一個真正的任務,我只是想知道PostgreSQL如何處理JOIN類邏輯。

+0

看看這個[如何比較postgres中的兩個表](http://stackoverflow.com/questions/4814597/how-to-compare-two-tables-in-postgres),這加快了差異[如何加快表之間的差異?](http://stackoverflow.com/questions/6337871/how-can-i-speed-up-a-diff-between-tables) – static 2013-03-11 02:49:20

+0

那麼你有你的答案嗎? – 2015-04-29 02:03:41

+0

是:Hadoop .... – odiszapc 2015-05-01 10:00:18

回答

18

最好的選擇可能是一個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; 

在概述在以後的文章基本技術:

BTW,這將是更有效地使用uuid列MD5哈希值:

-1

根據我的經驗,不在子查詢中需要很長時間。我會這樣做一個包容的加入:

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

然後做另一種方式相同的另一個表。

+0

請注意,NOT NOT與「NOT EXISTS」在本質上不同。 NULL處理是不同的,這使'NOT IN'更加昂貴。 – 2013-03-11 16:59:51