2015-01-17 27 views
0

Vs中存在:IN之間diff和存在於甲骨文

點1:

在:有效當子查詢包含相比於外部查詢

存在更少的行數:有效時子與外部查詢相比,查詢包含大量的行。子查詢返回TRUE或FALSE。外部查詢執行一次,對於外部查詢子查詢中的每個值執行

但是在最近版本的Oracle中,它們傾向於被優化器重寫爲相同的,使用相同的執行計劃谷歌)。執行計劃是相同的兩個IN和存在(在我的電腦觀察)

點2:我在谷歌搜索的差異之間NOT IN和NOT

存在。但他們中的大多數人認爲兩者是相同的。

我的問題:

問題1(點1):我的假設是否正確?如果兩者都被oracle用相同的方式處理,那麼我們可以在查詢中使用IN還是EXIST?

問題2(第2點):有人可以解釋爲什麼兩者都是相同的嗎?

+1

看看http://stackoverflow.com/questions/12896007/oracle-in-vs-exists-difference。差異也在處理空值 – ms32035

+0

我一直認爲EXIST是更高性能的,因爲該語句計數記錄,而IN語句列出了一系列實際值。第一個似乎更容易處理:如果找到1條記錄,則不需要進一步搜索,因爲EXIST布爾子句已知。在IN的情況下,他可能需要經歷各種價值觀。難怪IN子句起源於精確值列表('A','B','C'),在這種情況下,EXIST子句真的不同。 – tvCa

回答

0

這可能是很好的使用相同的優化路徑如今,他們沒有什麼不同,

這個不談,顯然 EXISTS子查詢接受和IN子查詢的支持和表達清單。

在某些情況下,您將不得不使用IN條件。

0

除非Oracle在12C中改變了這兩件事情的含義,否則您並不理解它們的作用。

IN函數接受一列值來運行查詢。鑑於:

select * from foo where bar in(1,4,3);

此計算結果爲:

SELECT * FROM foo其中巴= 1或巴= 4或巴= 3;

的EXIST功能允許通過一個子查詢進行選擇時,你獲得顯着的性能改進。例如:

SELECT * FROM foo其中,其中是否存在(選擇xfoo *其中XBAR = Z);

沒有EXISTS,整個子查詢必須完全評估。

有了EXISTS,子查詢只需要滿足找到的第一個元素。即:如果子查詢導致10,000行,那麼只要系統找到1行,子查詢就會返回true,並且滿足主查詢。