Oracle資料庫中 in與exists語句的區別

2021-07-05 04:05:42 字數 1776 閱讀 3243

(一)in的理解

如sql:select * from t1 where x in ( select y from t2 )中,先執行select y from t2,等價於select* from t1,( select distinct y from t2) t2 wheret1.x=t2.y。可以理解為:先進行子查詢,結果集合放到快取中,進行一定的處理(evaluated, distincted, indexed),然後於t1表連線查詢,也可以理解為:

定義:優化()=

--在快取中進優化處理,如果集合比較小,優化代價很小,不用每次都到表t2中取值,直接在記憶體獲取,比較快。

list resultset=;

array t1=(select * from t1);

array t2=(select y from t2);

array t3=優化(t3)--網上資料很多都沒有這一步,這一步其實是 in的優勢所在,也是缺陷所在,隨著子表的增大,優化的代價越來越高,因為t3的每個y值都要對t1進行全表掃瞄。

for(int i=0;i分析:

遍歷次數=t3.length*t1.length,in()比較適合用於外查詢大於內查詢的。建議在外查詢建立索引,因為避免每次對t1進行全表掃瞄。

(二)exists的理解

如sql:select * from t1 where exists  ( select 1 from t2 where y=x )中,可以理解為

for x in(select* from t1)

loop

if (exists  ( select 1 from t2 where y=x.x ))

then

(....outputthe record)

end if;

end loop;

(1)對t1中每條記錄執行exists  ( select 1 from t2 where y=x.x )返回值為true或者false。

(2)如果select 1 from t2 where y=x.x查詢有存在值則返回true,並把t1中對應的行記錄放入結果表(臨時表)中;

(3)如果返回false,t1中記錄不作處理,指標指向下一條t1中的記錄;

(4)重複(1)(2)(3)直到遍歷完t1表,輸出結果表中的記錄。

分析:t1中有幾條記錄就需要執行幾次select 1 from t2 where y=x.x,如果t1表很大,而且t2沒有索引的話需要對t2表進行全表遍歷t1.length(t1表中記錄數)次,代價好大。如果t1較小,t2有索引則exists效率比較高。

(三)總結

(1)外大於內時用in,這種說法不恰當,確切的說應該是外查詢數量遠大於內查詢,而且外查詢有索引時用in,資料數量級越大效果越明顯。

(2)內大於外用exists也不恰當,應該是內查詢數量遠大於外查詢,同時內查詢有索引的有索引的情況下,exists效率要高,資料數量級越大效果越明顯。

(3)如果內外資料量接近,in和exists效率應該看索引、伺服器效能(如快取大小、cpu效能)等情況。

(4)在

10g之後的版本,預設都是以基於成本的方式進行,這時候,

oracle

會先找出可能的執行方式,然後計算出每個執行計畫的成本,再選擇以較低成本的方式進行計算,這樣子在對in和

exists

的分析中,這兩種寫法會相互轉換,那個統計的成本資訊低則會選擇那種方式。當然由於

oracle

的成本資訊並不是全量統計得出來的結果,也會有一定的誤差,再統計資訊是需要人工(或定時)去執行統計的,如果操作大量資料後,沒有進行統計,偏差也會很大。

資料庫 Oracle中建立資料庫

create database lihua 網上的說法是 oracle中的例項只對應乙個資料庫,出現此種情況說明oracle資料庫處於mount 裝載 或open狀態,需要使用startup nomount語句進行狀態更改,或者是直接使用dbca的圖形介面來建立 注 經測試,startup nomo...

Oracle資料庫中rowid與rownum的區別

在查詢中,我們可以注意到,類似於 select xx from table where rownum n n 1 這樣的查詢是有正確含義的,而 select xx from table where rownum n 這樣的查詢只在n 1的時候成立,select xx from table where...

SQL Service與Oracle資料庫基礎

1.基本配置與使用 資料庫術語 資料庫例項 資料庫在記憶體的資料 與檔案中的資料庫相對應 資料庫網域名稱 分布式資料庫,通過資料庫鏈路實現遠端複製,資料庫網域名稱存在於引數檔案中 全域性資料庫 資料庫名 資料庫網域名稱 資料庫服務名 分布式資料庫中的全域性資料庫,本地資料庫的資料庫名 工具配置 db...