2017-08-06 61 views
0

我知道當我們在IN和NOT IN處使用EXISTS和NOT EXISTS時,查詢的性能得到了改進,但是,當性能進一步提高時我們用OUTER JOIN替換NOT IN而不是NOT EXISTS?在Oracle Database 12c中用NOT EXISTS和OUTER JOIN取代NOT IN

例如,以下查詢從PRODUCT表中選擇不在另一個稱爲PC的表中的所有模型。根據記錄,在產品或電腦桌沒有模型值爲空:

select model 
from product 
where not exists(
select * 
from pc 
where product.model = pc.model); 

以下OUTER JOIN將顯示同樣的結果:

select product.model 
from product left join pc 
on pc.model = product.model 
where pc.model is null; 

看到,因爲這些都返回相同的值,這我們應該使用選項來更好地改進查詢的性能嗎?

+1

兩者應該是一樣的。 Oracle有一個很好的優化器,這兩種表達方式都是半反連接。 –

+1

「我明白,當我們在IN和NOT IN處使用EXISTS和NOT EXISTS時,查詢的性能得到了改進。」在某些情況下。在其他情況下,IN或NOT IN表現更好。性能取決於驅動查詢和子查詢的相對大小。 – APC

回答

1

查詢計劃會告訴你。這將取決於數據和表格。在OUTER JOIN和NOT EXISTS的情況下,它們是相同的。

但是對於您的開頭句子,如果模型上接受NULL,那麼NOT IN和NOT EXISTS不相同。在這種情況下,你說模型不能爲空,所以你可能會發現它們都有相同的計劃。然而,在做這個假設時,必須告訴數據庫不能存在空值(使用NOT NULL),而不是簡單的不存在。如果您不這樣做,它會根據您的實際數據爲每個查詢制定不同的計劃,這可能會導致不同的性能。對於不索引NULL的ORACLE來說,這通常是正確的。

檢查出解釋計劃

+0

無論列是否爲NULL,查詢都會得到相同的結果集。他們可能有相同的執行計劃。因此,他們很可能完全相同。 –

+0

是的同意,沒有數據中的空值,結果將是相同的,無論如何。但是,如果有空值,它們會有不同的結果。 DB需要知道NULL不是一個選項,否則即使我們知道結果將是相同的,EXISTS和IN也不會生成相同的計劃。 – LoztInSpace

+0

'NOT EXISTS'和'LEFT JOIN' /'WHERE IS NULL'完全一樣。您可能會將此與'NOT IN'和'NOT EXISTS'混淆,其中'NULL'處理不同。 –