Oracle中exists與in的效率探討

in 與 exist 的語法比較:
? ?? ?? ? select × from 數據表 t where t.x in (...)
? ?? ?括號內可以是符合t.x字段類型的值集合,如('1','2','3'),但如果t.x是number類型的時候,似乎這樣的寫法會出問題;也可以是通 過另外的select語句查詢出來的值集合,如(select y from 數據表2 where ...)。

? ?? ?? ? select * from 數據表 t where [...] and exist (...)
? ?? ?方括號內為其它的查詢條件,可以沒有。exist后面的括號內可以是任意的條件,這個條件可以與外面的查詢沒有任何關系,也可以與外面的條件結合。如: (select * from 數據表2 where 1=1) 或 (select * from 數據表2 where y=t.x)

例子:

in的SQL語句
SELECT id, category_id, htmlfile, title, convert(varchar(20),begintime,112) as pubtime
FROM tab_oa_pub WHERE is_check=1 and
category_id in (select id from tab_oa_pub_cate where no='1')
order by begintime desc
exists的SQL語句
SELECT id, category_id, htmlfile, title, convert(varchar(20),begintime,112) as pubtime
FROM tab_oa_pub WHERE is_check=1 and
exists (select id from tab_oa_pub_cate where tab_oa_pub.category_id=convert(int,no) and no='1')
order by begintime desc

?



效率比較:
? ?? ???先討論IN和EXISTS。
? ?? ?? ?? ?select * from t1 where x in ( select y from t2 )
? ?? ???事實上可以理解為:
? ?? ?? ?? ?select * from t1, ( select distinct y from t2 ) t2 where t1.x = t2.y
? ?? ?? ?如果你有一定的SQL優化經驗,從這句很自然的可以想到t2絕對不能是個大表,因為需要對t2進行全表的“唯一排序”,如果t2很大這個排序的性能是不 可忍受的。但是t1可以很大,為什么呢?最通俗的理解就是因為t1.x=t2.y可以走索引。但這并不是一個很好的解釋。試想,如果t1.x和t2.y都 有索引,我們知道索引是種有序的結構,因此t1和t2之間最佳的方案是走merge join。另外,如果t2.y上有索引,對t2的排序性能也有很大提高。

? ?? ?? ?? ?select * from t1 where exists ( select null from t2 where y = x )
? ?? ???可以理解為:
? ?? ?? ?? ?for x in ( select * from t1 )
? ?? ?? ?? ?loop
? ?? ?? ?? ?? ? if ( exists ( select null from t2 where y = x.x ) then
? ?? ?? ?? ?? ?? ? OUTPUT THE RECORD!
? ?? ?? ?? ?? ? end if
? ?? ?? ?? ?end loop
? ?? ???這個更容易理解,t1永遠是個表掃描!因此t1絕對不能是個大表,而t2可以很大,因為y=x.x可以走t2.y的索引。

? ?? ???綜合以上對IN/EXISTS的討論,我們可以得出一個基本通用的結論:IN適合于外表大而內表小的情況;EXISTS適合于外表小而內表大的情況。

轉載于:https://www.cnblogs.com/alicesunBlog/archive/2013/01/15/2861209.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/392700.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/392700.shtml
英文地址,請注明出處:http://en.pswp.cn/news/392700.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

log日志輪轉--logrotate

服務器上的日志包括系統日志和服務日志每天都會產生n多log,好多人會自己寫腳本來進行日志的切割、壓縮等,而忽略了系統自帶的服務--logrotate。 簡介 logrotate是個十分有用的工具,它可以自動對日志進行截斷(或輪循)、壓縮以及刪除…

2個字段并在一次插入一個字段里面_elasticsearch外用與內觀(二)-當插入文檔時,elasticsearch都在做什么...

Previous: elasticsearch外用與內觀(一)-常用功能與使用方法 在了解了es的基本用法之后,我們再來看看當插入文檔數據時,elasticsearch都在做什么。首先,es的索引只是一個邏輯概念,實際上是由一個個物理分片組成的,每個分片就是一個…

學習Spring Data JPA

簡介 Spring Data 是spring的一個子項目,在官網上是這樣解釋的: Spring Data 是為數據訪問提供一種熟悉且一致的基于Spring的編程模型,同時仍然保留底層數據存儲的特??殊特性。它可以輕松使用數據訪問技術,可以訪問關系和非關系…

azure多功能成像好用嗎_Azure持久功能簡介:模式和最佳實踐

azure多功能成像好用嗎Authored with Steef-Jan Wiggers at Microsoft Azure由Microsoft Azure的Steef-Jan Wiggers撰寫 With Durable Functions, you can program a workflow and instantiate tasks in sequential or parallel order, or you can build a watch or support a…

leetcode 327. 區間和的個數(treemap)

給定一個整數數組 nums,返回區間和在 [lower, upper] 之間的個數,包含 lower 和 upper。 區間和 S(i, j) 表示在 nums 中,位置從 i 到 j 的元素之和,包含 i 和 j (i ≤ j)。 說明: 最直觀的算法復雜度是 O(n2) ,請在此…

常用的工具函數

得到兩個數組的并集, 兩個數組的元素為數值或字符串//tools.js export const getUnion (arr1, arr2) > {return Array.from(new Set([...arr1, ...arr2])) }//調用頁面 import { getUnion } from /libs/toolsthis.getUnion getUnion([1,2,3,5],[1,4,6]) //(6) [1, 2, 3,…

git 常用commands(轉)

常用 Git 命令清單 作者: 阮一峰 日期: 2015年12月 9日 我每天使用 Git ,但是很多命令記不住。 一般來說,日常使用只要記住下圖6個命令,就可以了。但是熟練使用,恐怕要記住60~100個命令。 下面是…

Win2003磁盤分區調整

引用如下: 可能大家都知道,在Windows Server 2003下,普通版本的分區魔術師是無法運行的,而Windows內置的命令行工具Diskpart則能勝任分區魔術師的大部分工作,它的功能非常強大。輸入Diskpart后,將顯示如圖所…

檢查集群狀態命令_輕松管理Kubernetes集群的7個工具

Kubernetes正在不斷加快在云原生環境的應用,但如何以統一、安全的方式對運行于任何地方的Kubernetes集群進行管理面臨著挑戰,而有效的管理工具能夠大大降低管理的難度。K9sk9s是基于終端的資源儀表板。它只有一個命令行界面。無論在Kubernetes儀表板Web …

leetcode 122. 買賣股票的最佳時機 II(貪心算法)

給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。 設計一個算法來計算你所能獲取的最大利潤。你可以盡可能地完成更多的交易(多次買賣一支股票)。 注意:你不能同時參與多筆交易(你必須在再次購買前出售掉…

前端繪制繪制圖表_繪制圖表(第2頁):JavaScript圖表庫的比較

前端繪制繪制圖表by Mandi Cai蔡曼迪 繪制圖表(第2頁):JavaScript圖表庫的比較 (Charting the waters (pt. 2): a comparison of JavaScript charting libraries) 深入研究D3.js,Dygraphs,Chart.js和Google Charts (A deep dive into D3.js,…

python 3.6.5 pip_在Windows 10 + Python 3.6.5 中用 pip 安裝最新版 TensorFlow v1.8 for GPU

聲明什么cuDNN之類的安裝,應該是毫無難度的,按照官網的教程來即可,除非。。。像我一樣踩了狗屎運。咳咳,這些問題不是本文的關鍵。本文的關鍵是解決pip安裝tensorflow gpu版的問題。安裝環境操作系統:64位的Windows 10…

模板進階——模板實參推斷

一、關鍵點 模板實參:模板參數T的實例類型,如int、string等 模板實參推斷:從函數實參來確定模板實參的過程 模板類型參數與類型轉換:const的轉換、數組/函數到指針的轉換 顯式模板實參:當模板參數類型并未出現在函數參…

leetcode 973. 最接近原點的 K 個點(排序)

我們有一個由平面上的點組成的列表 points。需要從中找出 K 個距離原點 (0, 0) 最近的點。 (這里,平面上兩點之間的距離是歐幾里德距離。) 你可以按任何順序返回答案。除了點坐標的順序之外,答案確保是唯一的。 示例 1&#xf…

ios 打開揚聲器

[[UIDevice currentDevice] setProximityMonitoringEnabled:YES]; AVAudioSession *audioSession [AVAudioSession sharedInstance]; //默認情況下揚聲器播放 [audioSession setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthe…

sqlserver 批量處理數據

目前我覺得有兩種方法可以用作批量數據的處理,也算比較靠譜的吧:sqlbulkcopy 和利用表值函數。 1.sqlbulkcopy是dotnet中的一個用來處理大批量插入數據的,具體用法如下: using (SqlConnection conSave new SqlConnection(Config.…

區塊鏈編程語言_區塊鏈開發中使用的最受歡迎的編程語言

區塊鏈編程語言by Michael Draper通過邁克爾德雷珀(Michael Draper) We’re currently in the midst of a new burgeoning industry with blockchain development.我們目前正處于區塊鏈開發的新興行業中。 Blockchain technology is very much in a nascent stage, however t…

vscode 模糊部分代碼_本周 GitHub 速覽:您的代碼有聲兒嗎?(Vol.38)

作者:HelloGitHub-小魚干摘要:還記得花式夸贊程序員的彩虹屁插件 vscode-rainbow-fart 嗎?它后續有人啦!JazzIt 同它的前輩 vscode-rainbow-fart 一樣,是一個能讓代碼“發聲”的工具,它會在腳本運行成功或者…

有趣的鏈接

1行命令實現人臉識別:https://linux.cn/article-9003-1.html轉載于:https://blog.51cto.com/10704527/1983007

webpack基礎使用Loader(三)

loaders:[ { test:/\.js$/, loader:babel-loader, exclude:__dirname"/node_modules/", //排除打包的范圍(需要絕對路徑) include:__dirname"src",//指定打包的范圍(需要絕對路徑) query:{ …