SQL查詢效能調校經驗談(一)_where條件中In包覆子查詢跟使用join方式

由於近期工作專案
有一段涉及到By 系統管理員資料表(只有工號) 去和 公司員工表(有工號、姓名)
兜出完整的姓名跟工號組合

情況:
common..comper 隸屬於common DB的員工資料表(8萬筆)
ndamgrsys..ndard_sysmgr_owner 系統管理者表(5~10筆)


因此一開始很直覺的寫了這麼一段SQL查詢

SQL查詢語句

1
select * from common..comper  where com_empno IN (select nso_empno from ndard_sysmgr_owner where nso_role='busMgr')

邏輯是正確的但是效能查詢上並不優
我從一張大約有8萬筆資料的員工表中來去每一筆做子查詢比對

所以如果
Record有1000筆,則in的子查詢需要跑1000次
Record有1000ㄢ筆,則in的子查詢需要跑10000次...
會將每一筆資料都去比in裡面的子查詢


SQL查詢語句(優化後)

1
2
3
select so.nso_empno,emp.com_cname from (select nso_empno from ndamgrsys..ndard_sysmgr_owner where nso_role='busMgr' ) as so
inner join (select com_empno,com_cname from common..comper ) as emp
ON so.nso_empno = emp.com_empno

改為從小的結果集來做join
就可以觀察到SQL查詢成本足足少了原來的三分之二左右


原本是整本字典從第一頁翻到最後一頁地毯式搜尋改為透過查部首、筆畫之類的索引
來加速查找到符合特定幾頁的條件(比方A開頭的英文單字....捨麼部首的....)





參考:
https://stackoverflow.com/questions/1200295/sql-join-vs-in-performance
https://ithelp.ithome.com.tw/questions/10155255
https://dotblogs.com.tw/grayyin/2016/03/31/170714
https://www.itread01.com/qyqx.html



留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

Architecture(架構) 和 Framework(框架) 有何不同?_軟體設計前的事前規劃的藍圖概念

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header