oracle IN與EXISTS子查詢的關係

2021-06-20 05:46:34 字數 937 閱讀 5076

在我任職的公司裡面,有很多的規範啊手冊一類的東西。我們公司oracle語法規範裡面有2條我一直就很懷疑(1.子查詢結果集小,用in 2.

外表小,子查詢表大,用exists),我前幾天看了一些文章說每個版本的oracle的cbo有一些的不同,我想試驗下,剛才的2條規則。由於我手上只有10g和11g的環境,我只能給大家演示這2個版本的。

通過上面的例子,我發現一般情況下的子查詢,用in和extsis在oracle 10g裡面執行計畫是一樣的。接著試驗11g

哈哈!用in和extsis在oracle 11g裡面執行計畫也是一樣的。

但是oracle優化器還是有限制的,

無法unnest的限制如子查詢有connect by,set操作,rownum,關聯子查詢內部包含分組函式等。還比如semi join.anti join條件帶or的形式等。這時候,我們常用的優化方式就是sql的等價改寫,這要根據具體的業務和資料特點,來重寫等價的sql。比如下面的sql。

所以有時候,大家寫完sql後,要看看執行計畫的。

ORACLE in與exists的選擇

業務問題大概可以這樣描述,乙個父表,乙個子表,查詢的結果是找到子表中沒有使用父表id的記錄,這種情況估計很多系統都會牽涉得到。讓我們來舉乙個例子 表一 父表 parent 1 id varchar2 10 主鍵 2 name varchar2 100 名稱 表二 子表 childen 1 id va...

ORACLE in與exists語句的區別

業務問題大概可以這樣描述,乙個父表,乙個子表,查詢的結果是找到子表中沒有使用父表id的記錄,這種情況估計很多系統都會牽涉得到。讓我們來舉乙個例子 表一 父表 parent 表二 子表 childen 父表儲存父親,子表儲存孩子,然後通過pid和父表關聯,查詢需要的結果是找到尚未有孩子的父親。我們來看...

ORACLE in與exists語句的區別

一 例項 insert into his batch excel data select 3402 as batch id,t.excel name,t.op time,t.staff id,2 state,t.imp type,t.acc nbr,t.mkt comm code,t.no stat...