我要查询的两个表各有约 1.5 亿行。
以下语句我在 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 表不存在的所有元素。
第二个查询(快速)状态给出了确实存在的 Cats 子集中不存在的所有元素。
我期望以下查询:
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 中的所有元素,返回包含 cat 中不等于 dog 中的元素的每个元素的集合
∀ Cat (Ǝ cat = Ǝdog)
对于 Cat 中的所有元素,返回包含 cat 中与 dog 中的元素相等的每个元素的集合
∀ Cat (Ǝ innerCat ≠ Ǝcat)
对于 Cat 中的所有元素,返回包含不等于 cat 中元素的内部 cat 的每个元素的集合
第二次更新
我看到我的数学与我的 SQL 不一致。