sql語(yǔ)句優(yōu)化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的語(yǔ)句
更新時(shí)間:2007年08月23日 17:43:10 作者:
在許多基于基礎(chǔ)表的查詢中,為了滿足一個(gè)條件,往往需要對(duì)另一個(gè)表進(jìn)行聯(lián)接。在這種情況下, 使用EXISTS(或NOT EXISTS)通常將提高查詢的效率。在子查詢中,NOT IN子句將執(zhí)行一個(gè)內(nèi)部的排序和合并。無(wú)論在哪種情況下,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 效率問(wèn)題記錄
- sql not in 與not exists使用中的細(xì)微差別
- Mysql中in和exists的區(qū)別?&?not?in、not?exists、left?join的相互轉(zhuǎn)換問(wèn)題
- SQL中NOT IN與NOT EXISTS不等價(jià)的問(wèn)題
相關(guān)文章
SqlServer數(shù)據(jù)庫(kù)全角轉(zhuǎn)換成半角
SqlServer數(shù)據(jù)庫(kù)全角轉(zhuǎn)換成半角,需要的朋友可以參考一下2013-03-03
SQL Server誤區(qū)30日談 第23天 有關(guān)鎖升級(jí)的誤區(qū)
在SQL Server 2005和之前的版本,頁(yè)鎖會(huì)直接升級(jí)到表鎖。在SQL Server 2005或SQL Server 2008,你可以通過(guò)如下跟蹤標(biāo)志改變鎖升級(jí)的行為2013-01-01
SQL SERVER 中構(gòu)建執(zhí)行動(dòng)態(tài)SQL語(yǔ)句的方法
這篇文章主要介紹了SQL SERVER 中構(gòu)建執(zhí)行動(dòng)態(tài)SQL語(yǔ)句的方法,需要的朋友可以參考下2017-06-06
解鎖?SQL?Server?2022的時(shí)間序列數(shù)據(jù)功能(示例詳解)
SQL?Server2022在處理時(shí)間序列數(shù)據(jù)時(shí),SQL?Server?提供了一些優(yōu)化和功能,比如?DATE_BUCKET?函數(shù)、窗口函數(shù)以及其他時(shí)間日期函數(shù),以便更高效地處理時(shí)間序列數(shù)據(jù),這篇文章主要介紹了解鎖?SQL?Server?2022的時(shí)間序列數(shù)據(jù)功能,需要的朋友可以參考下2024-08-08
MSSQL自動(dòng)重建出現(xiàn)碎片的索引的方法分享
無(wú)論何時(shí)對(duì)基礎(chǔ)數(shù)據(jù)執(zhí)行插入、更新或刪除操作,SQL Server 數(shù)據(jù)庫(kù)引擎都會(huì)自動(dòng)維護(hù)索引。隨著時(shí)間的推移,這些修改可能會(huì)導(dǎo)致索引中的信息分散在數(shù)據(jù)庫(kù)中(含有碎片)。當(dāng)索引包含的頁(yè)中的邏輯排序(基于鍵值)與數(shù)據(jù)文件中的物理排序不匹配時(shí),就存在碎片。碎片非常多的索引可能會(huì)降低查詢性能,導(dǎo)致應(yīng)用程序響應(yīng)緩慢。2014-06-06
記一次成功的sql注入入侵檢測(cè)附帶sql性能優(yōu)化
很多同學(xué)和園友都遇到過(guò)sql注入的,其中大部分都是代碼的不嚴(yán)謹(jǐn)造成的,都是犯過(guò)很多錯(cuò)誤才學(xué)會(huì)認(rèn)真起來(lái)2011-09-09

