sql語句優(yōu)化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的語句
更新時(shí)間:2007年08月23日 17:43:10 作者:
在許多基于基礎(chǔ)表的查詢中,為了滿足一個(gè)條件,往往需要對(duì)另一個(gè)表進(jìn)行聯(lián)接。在這種情況下, 使用EXISTS(或NOT EXISTS)通常將提高查詢的效率。在子查詢中,NOT IN子句將執(zhí)行一個(gè)內(nèi)部的排序和合并。無論在哪種情況下,NOT IN都是最低效的 (因?yàn)樗鼘?duì)子查詢中的表執(zhí)行了一個(gè)全表遍歷)。為了避免使用NOT IN ,我們可以把它改寫成外連接(Outer Joins)或NOT EXISTS。
如
我要查詢 Sendorder表中的冗余數(shù)據(jù)(沒有和reg_person或worksite相連的數(shù)據(jù))
sql="select Sendorder.id,Sendorder.reads,Sendorder.addtime from Sendorder where Sendorder.person_id not in(select user_id from reg_person ) or Sendorder.worksite_id not in(select id from worksite) order by Sendorder.addtime desc"
程序執(zhí)行時(shí)間:40109.38毫秒
sql="select Sendorder.id,Sendorder.reads,Sendorder.addtime from Sendorder where not EXISTS (SELECT id FROM reg_person where reg_person.user_id=Sendorder.person_id) or not EXISTS (SELECT id FROM worksite where worksite.id=Sendorder.worksite_id) order by Sendorder.addtime desc"
程序執(zhí)行時(shí)間:8531.25毫秒
很明顯使用not EXISTS效率高多了
如
我要查詢 Sendorder表中的冗余數(shù)據(jù)(沒有和reg_person或worksite相連的數(shù)據(jù))
sql="select Sendorder.id,Sendorder.reads,Sendorder.addtime from Sendorder where Sendorder.person_id not in(select user_id from reg_person ) or Sendorder.worksite_id not in(select id from worksite) order by Sendorder.addtime desc"
程序執(zhí)行時(shí)間:40109.38毫秒
sql="select Sendorder.id,Sendorder.reads,Sendorder.addtime from Sendorder where not EXISTS (SELECT id FROM reg_person where reg_person.user_id=Sendorder.person_id) or not EXISTS (SELECT id FROM worksite where worksite.id=Sendorder.worksite_id) order by Sendorder.addtime desc"
程序執(zhí)行時(shí)間:8531.25毫秒
很明顯使用not EXISTS效率高多了
您可能感興趣的文章:
- MySQL: mysql is not running but lock exists 的解決方法
- mysql insert if not exists防止插入重復(fù)記錄的方法
- UCenter info: MySQL Query Error SQL:SELECT value FROM [Table]vars WHERE noteexists
- mysql not in、left join、IS NULL、NOT EXISTS 效率問題記錄
- sql not in 與not exists使用中的細(xì)微差別
- Mysql中in和exists的區(qū)別?&?not?in、not?exists、left?join的相互轉(zhuǎn)換問題
- SQL中NOT IN與NOT EXISTS不等價(jià)的問題
相關(guān)文章
SQL Server ltrim(rtrim()) 去不掉空格的原因分析
這篇文章主要介紹了SQL Server ltrim(rtrim()) 去不掉空格的原因分析,原因主要是因?yàn)橹虚g存在回車符或者換行符,所以要先將此符號(hào)替換掉,具體示例代碼大家參考下本文2017-08-08將所有符合條件的結(jié)果拼接成一列并用逗號(hào)隔開的一個(gè)sql語句
把所有符合條件的結(jié)果拼接成一列,用逗號(hào)隔開的一個(gè)sql語句。2010-06-06SQL Server日期加減函數(shù)DATEDIFF與DATEADD用法分析
這篇文章主要介紹了SQL Server日期加減函數(shù)DATEDIFF與DATEADD用法,結(jié)合分析SQL Server使用DATEDIFF與DATEADD函數(shù)獲取常見的周、月、天等日期相關(guān)運(yùn)算技巧,需要的朋友可以參考下2017-03-03MSSQL 計(jì)算兩個(gè)日期相差的工作天數(shù)的語句
MSSQL計(jì)算兩個(gè)日期相差的工作天數(shù)的代碼,需要的朋友可以參考下。2009-09-09刪除數(shù)據(jù)庫中重復(fù)數(shù)據(jù)的幾個(gè)方法
刪除數(shù)據(jù)庫中重復(fù)數(shù)據(jù)的幾個(gè)方法...2006-12-12SQL SERVER備份數(shù)據(jù)庫存儲(chǔ)過程的方法
這篇文章主要介紹了SQL SERVER備份數(shù)據(jù)庫存儲(chǔ)過程的方法,需要的朋友可以參考下2015-10-10SQL Server Alert發(fā)送告警郵件少了的原因
這篇文章主要為大家詳細(xì)介紹了SQL Server Alert發(fā)送告警郵件少了的原因,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06關(guān)于sql server批量插入和更新的兩種解決方案
對(duì)于sql 來說操作集合類型(一行一行)是比較麻煩的一件事,而一般業(yè)務(wù)邏輯復(fù)雜的系統(tǒng)或項(xiàng)目都會(huì)涉及到集合遍歷的問題,通常一些人就想到用游標(biāo),這里我列出了兩種方案,供大家參考2013-04-04SQL查詢某列指定長度的字符串多余的用省略號(hào)來表示
有時(shí)候?yàn)榱嗣烙^,只需要顯示前面幾個(gè)字符串,剩下的可以用省略號(hào)來表示,下面有個(gè)不錯(cuò)的示例,感興趣的朋友可以參考下2013-11-11