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
留言
張貼留言