sql語句優(yōu)化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的語句
更新時間:2007年08月23日 17:43:10 作者:
在許多基于基礎(chǔ)表的查詢中,為了滿足一個條件,往往需要對另一個表進行聯(lián)接。在這種情況下, 使用EXISTS(或NOT EXISTS)通常將提高查詢的效率。在子查詢中,NOT IN子句將執(zhí)行一個內(nèi)部的排序和合并。無論在哪種情況下,NOT IN都是最低效的 (因為它對子查詢中的表執(zhí)行了一個全表遍歷)。為了避免使用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í)行時間: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í)行時間: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í)行時間: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í)行時間: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使用中的細微差別
- Mysql中in和exists的區(qū)別?&?not?in、not?exists、left?join的相互轉(zhuǎn)換問題
- SQL中NOT IN與NOT EXISTS不等價的問題
相關(guān)文章
SQL Server ltrim(rtrim()) 去不掉空格的原因分析
這篇文章主要介紹了SQL Server ltrim(rtrim()) 去不掉空格的原因分析,原因主要是因為中間存在回車符或者換行符,所以要先將此符號替換掉,具體示例代碼大家參考下本文2017-08-08將所有符合條件的結(jié)果拼接成一列并用逗號隔開的一個sql語句
把所有符合條件的結(jié)果拼接成一列,用逗號隔開的一個sql語句。2010-06-06SQL Server日期加減函數(shù)DATEDIFF與DATEADD用法分析
這篇文章主要介紹了SQL Server日期加減函數(shù)DATEDIFF與DATEADD用法,結(jié)合分析SQL Server使用DATEDIFF與DATEADD函數(shù)獲取常見的周、月、天等日期相關(guān)運算技巧,需要的朋友可以參考下2017-03-03刪除數(shù)據(jù)庫中重復(fù)數(shù)據(jù)的幾個方法
刪除數(shù)據(jù)庫中重復(fù)數(shù)據(jù)的幾個方法...2006-12-12SQL SERVER備份數(shù)據(jù)庫存儲過程的方法
這篇文章主要介紹了SQL SERVER備份數(shù)據(jù)庫存儲過程的方法,需要的朋友可以參考下2015-10-10SQL Server Alert發(fā)送告警郵件少了的原因
這篇文章主要為大家詳細介紹了SQL Server Alert發(fā)送告警郵件少了的原因,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06關(guān)于sql server批量插入和更新的兩種解決方案
對于sql 來說操作集合類型(一行一行)是比較麻煩的一件事,而一般業(yè)務(wù)邏輯復(fù)雜的系統(tǒng)或項目都會涉及到集合遍歷的問題,通常一些人就想到用游標(biāo),這里我列出了兩種方案,供大家參考2013-04-04