sqlserver not in 語句使程充瓦解。本站提示廣大學習愛好者:(sqlserver not in 語句使程充瓦解)文章只能為提供參考,不一定能成為您想要的結果。以下是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 我想是許多人沒想到的.