18

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

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

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

4

4 に答える 4

35

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 ハッシュに対して効率的です。

于 2013-03-11T07:12:04.407 に答える
-1

私の経験では、サブクエリを使用した 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)

そして、もう一方のテーブルについても同じことを逆に行います。

于 2013-03-11T07:45:08.260 に答える