今天寫一個存儲過程,由於執行的時間比較長(7秒)所以打算優化一下.結果在優化測試代碼中發現如下一個奇怪的現象.
現在有一個表mis_gl_balance,其中有一個字段ACC_SEGMENT VARCHAR(181) NULL ,他的內容的形式如下:
3810.105301.5414070180.000000.00000000.0000.000000
另外一個表finance_budget_account 主要記錄了budget_type 預算類型和mis_code MIS系統編碼.這裡的MIS編碼就是ACC_SEGMENT表中的第三段.
為了查詢出某種預算類型的所有ACC_SEGMENT ,所以寫了如下這樣的代碼:
selectACC_SEGMENT
fromdbo.mis_gl_balance
whereLEFT(ACC_SEGMENT,22)IN(SELECT'3810.105301.'+mis_code
FROM finance_budget_account
WHERE budget_type='電路租費')
以上SQL語句就是把某種電路租費的ACC_SEGMENT全部取出來了.執行效率還能夠接收,1秒鐘就完成了.
但是如果改成了如下的代碼:
DECLARE@mis_company_codechar(4)
SET@mis_company_code='3810'
selectACC_SEGMENT
fromdbo.mis_gl_balance
whereLEFT(ACC_SEGMENT,22)IN(SELECT @mis_company_code+'.105301.'+mis_code
FROM finance_budget_account
WHERE (budget_type='電路租費'))
比較這兩段SQL.我們只是將其中的一個字符串'3810'寫成了參數的形式,但是執行的效率就完全不一樣了.
第二種SQL語句花費了7秒鐘的時間.
為什麼同樣的SQL語句,執行效率相差那麼大拉?