2013-03-11 5 views
8

私は32バイトのラテンフィールド(単純なmd5ハッシュ)を1つだけ持つPostgresに2つの同様のテーブルを持っています。 どちらのテーブルにも~30,000,000行あります。テーブルはほとんど違いがありません(10-1000行は異なります)PostgreSQLの2つの大きなテーブルの違いを見つける

Postgresでこれらのテーブルの違いを見つけることは可能ですか?結果は上記の10〜1000行にする必要があります。

これは実際の作業ではありません。私は、PostgreSQLがJOINのようなロジックをどのように扱うかについて知りたいだけです。

+0

この[[Postgresの2つのテーブルを比較する方法](http://stackoverflow.com/questions/4814597/how-to-compare-two-tables-in-postgres)とこれを参照してくださいdiff [どのようにテーブル間の差分を速くすることができますか?](http://stackoverflow.com/questions/6337871/how-can-i-speed-up-a-diff-between-tables) – static

+0

あなたは答えを持っていますか? –

+0

はい:Hadoop .... – odiszapc

答えて

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; 

概要次の記事では、

ところで、それは次のようになりMD5ハッシュのためuuid列を使用する方が効率的ずっと:

-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 IN」は、「NOT EXISTS」とは原理的に異なります。 'NULL'の扱いが違うので、' NOT IN'をもっと高価にします。 –

関連する問題