web-dev-qa-db-ja.com

PostgreSQLの2つの大きなテーブルの違いを見つける

Postgresには、32バイトのラテンフィールド(単純なmd5ハッシュ)が1つだけある2つの同様のテーブルがあります。両方のテーブルには最大30,000,000行があります。テーブルにはほとんど違いがありません(10〜1000行が異なります)

Postgresでこれらのテーブル間の違いを見つけることは可能ですか?結果は上記の10〜1000行になるはずです。

これは実際のタスクではありません。PostgreSQLがJOINのようなロジックをどのように処理するかについて知りたいだけです。

11
odiszapc

最良のオプションはおそらく 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ハッシュの列を使用する方がmuchより効率的です uuid

27

既存の回答を補強するために、結合条件にrow()関数を使用します。これにより、行全体を比較できます。例えば。対称差を確認するための私の典型的なクエリは次のようになります

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