我正在查詢的兩個表都有大約1.5億行。令人困惑的性能增益與嵌套選擇*不存在
下面的語句我結束之後,在沒有45分鐘回來,所以我不知道多久會運行:
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)));
:
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 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]
UPD ATE
集符號在數學上證明我的要求(請糾正我,如果我使用了錯誤的符號):
∀ Cat (Ǝ cat ≠ Ǝdog)
對於貓的所有元素,返回一個包含沒有貓的每個元素的集合在狗
∀ Cat (Ǝ cat = Ǝdog)
對於貓的所有元素等於一個元素,返回一個包含不相等的元素在狗貓的每個元素設定
∀ Cat (Ǝ innerCat ≠ Ǝcat)
對於貓的所有元素,返回一個包含不貓
二更新
我看到我的數學不與排隊等於元素內貓的每個元素的集合我SQL。
您是否嘗試過EXPLAIN來查看計劃? – podiluska 2012-08-03 14:09:54
@podiluska當我做一個解釋計劃它不會產生任何東西。當我運行select語句來驗證計劃是。 – Woot4Moo 2012-08-03 14:12:09
他們確實返回不同的結果集,這可能會解釋性能增益.... – podiluska 2012-08-03 14:15:28