Postgresには、32バイトのラテンフィールド(単純なmd5ハッシュ)が1つだけある2つの同様のテーブルがあります。両方のテーブルには最大30,000,000行があります。テーブルにはほとんど違いがありません(10〜1000行が異なります)
Postgresでこれらのテーブル間の違いを見つけることは可能ですか?結果は上記の10〜1000行になるはずです。
これは実際の作業ではありません。PostgreSQLがJOINのようなロジックをどのように処理するかについて知りたいだけです。
Postgresには、32バイトのラテンフィールド(単純なmd5ハッシュ)が1つだけある2つの同様のテーブルがあります。両方のテーブルには最大30,000,000行があります。テーブルにはほとんど違いがありません(10〜1000行が異なります)
Postgresでこれらのテーブル間の違いを見つけることは可能ですか?結果は上記の10〜1000行になるはずです。
これは実際の作業ではありません。PostgreSQLがJOINのようなロジックをどのように処理するかについて知りたいだけです。
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 ハッシュに対して効率的です。
私の経験では、サブクエリを使用した 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)
そして、もう一方のテーブルについても同じことを逆に行います。