您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關sqlserver not in語句為什么使程充崩潰,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
兩張表 組織架構表(Organise) 和 工資發放歷史記錄表 (WagePerMonthHis) 兩張表通過 Organise.Item_id 和 WagePerMonthHis.OrgIdS 進行關聯 Organise表(以下簡稱O表)中大約有6000條記錄11個字段 ,WagePerMonthHis(以下簡稱W表)計有 125萬條記錄 和 25個字段 原程序中一段如下的語句 是查詢所有不在W表的組織架構層級為2的記錄復制代碼 代碼如下: select OrgId as 公司編碼,OrgName as 公司名稱 from Organise where OrgLev=2 and item_id not in (select OrgidS from WagesPerMonthHis where WagesYear='2010' and WagesMonth= '01' Group by OrgidS,OrgNameS) order by Orgid
語句執行要33秒之久,服務器的配置是比較高的:16核心4CPU,24G內存,且內存和CPU在執行時都沒有出現瓶頸,開始以為是 (select OrgidS from WagesPerMonthHis where WagesYear='2010' and WagesMonth= '01' Group by OrgidS,OrgNameS) 這條語句執行緩慢所致,單獨執行這條卻發現執行速度很快,大約不到2秒就出來了,于是癥結出來了,是not in 這個全掃描關鍵詞帶來的性能下降.最直接的是導致頁面失去響應,一個關鍵功能使用不了. 試了not exist語句,發現效果是一樣的,并不象網上所說可以提高很多性能. 于是重新優化語句如下復制代碼 代碼如下: select a.OrgId as 公司編碼,a.OrgName as 公司名稱,a.item_id from Organise a left outer join (select distinct b.OrgIdS from WagesPerMonthHis b where WagesYear='2010' and WagesMonth='01') as b on a.item_id = b.OrgidS where a.OrgLev = 2 and b.OrgIdS is Null order by 公司編碼
改用左外連接(其實左連接也可以)后,整個語句執行速度為400ms, 33秒與400ms 我想是很多人沒想到的.
看完上述內容,你們對sqlserver not in語句為什么使程充崩潰有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。