両方に対してクエリを実行している2つのテーブルには、それぞれ最大1億5,000万行があります。
次のステートメントは、45分間戻らなかった後に終了するため、実行時間がわかりません。
select * from Cats cat
where not exists( select dog.foo,dog.bar from Dogs dog
where cat.foo = dog.foo
and cat.bar = dog.bar);
ただし、このクエリは約3分で実行されます。
select * from Cats outside
where not exists(select * from Cats cat
where exists( select dog.foo,dog.bar from Dogs dog
where cat.foo = dog.foo
and cat.bar = dog.bar)));
私の質問は、このパフォーマンスの向上が見られる舞台裏で何が起こっているのかということです。
同じ結果セットを返す理由:
最初のクエリ(遅い)は、Catsテーブルに基づいて存在しないすべての要素を提供することを示しています。
2番目のクエリ(高速)は、存在する猫のサブセットから存在しないすべての要素を提供することを示しています。
私は次のクエリを期待しています:
select dog.foo,dog.bar from Dogs dog
where cat.foo = dog.foo
and cat.bar = dog.bar
[A、B、C]を返す
これは両方の機能に共通です。
私の猫のテーブルには次のものがあります:[A、B、C、D、E]
私は次のクエリを期待します:
select * from Cats cat
where exists
[A、B、C]と最後のピースを返すには:
select * from Cats outside
where not exists
[D、E]を返す
アップデート
私の主張を数学的に証明するために記法を設定します(間違った記号を使用した場合は訂正してください):
∀ Cat (Ǝ cat ≠ Ǝdog)
Catのすべての要素について、dogの要素と等しくないcatの各要素を含むセットを返します。
∀ Cat (Ǝ cat = Ǝdog)
Catのすべての要素について、dogの要素と等しいcatの各要素を含むセットを返します。
∀ Cat (Ǝ innerCat ≠ Ǝcat)
Catのすべての要素について、catの要素と等しくない内部catの各要素を含むセットを返します。
2回目の更新
私の数学が私のSQLと一致していなかったことがわかります。