天天看點

同樣功能的SQL語句,寫成參數和寫成常量怎麼效率會有那麼大的差别

今天寫一個存儲過程,由于執行的時間比較長(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 ,是以寫了如下這樣的代碼:

同樣功能的SQL語句,寫成參數和寫成常量怎麼效率會有那麼大的差别

select ACC_SEGMENT

同樣功能的SQL語句,寫成參數和寫成常量怎麼效率會有那麼大的差别

from dbo.mis_gl_balance

同樣功能的SQL語句,寫成參數和寫成常量怎麼效率會有那麼大的差别

where LEFT(ACC_SEGMENT,22) IN (SELECT '3810.105301.'+mis_code

同樣功能的SQL語句,寫成參數和寫成常量怎麼效率會有那麼大的差别

FROM         finance_budget_account

同樣功能的SQL語句,寫成參數和寫成常量怎麼效率會有那麼大的差别

WHERE     budget_type = '電路租費')

以上SQL語句就是把某種電路租費的ACC_SEGMENT全部取出來了.執行效率還能夠接收,1秒鐘就完成了.

但是如果改成了如下的代碼:

同樣功能的SQL語句,寫成參數和寫成常量怎麼效率會有那麼大的差别

DECLARE @mis_company_code char(4)

同樣功能的SQL語句,寫成參數和寫成常量怎麼效率會有那麼大的差别

SET @mis_company_code='3810'

同樣功能的SQL語句,寫成參數和寫成常量怎麼效率會有那麼大的差别
同樣功能的SQL語句,寫成參數和寫成常量怎麼效率會有那麼大的差别
同樣功能的SQL語句,寫成參數和寫成常量怎麼效率會有那麼大的差别

where LEFT(ACC_SEGMENT,22) IN (SELECT    @mis_company_code+'.105301.'+mis_code

同樣功能的SQL語句,寫成參數和寫成常量怎麼效率會有那麼大的差别
同樣功能的SQL語句,寫成參數和寫成常量怎麼效率會有那麼大的差别

WHERE     (budget_type = '電路租費'))

比較這兩段SQL.我們隻是将其中的一個字元串'3810'寫成了參數的形式,但是執行的效率就完全不一樣了.

第二種SQL語句花費了7秒鐘的時間.

為什麼同樣的SQL語句,執行效率相差那麼大拉?

本文轉自深藍居部落格園部落格,原文連結:http://www.cnblogs.com/studyzy/archive/2007/08/31/877523.html,如需轉載請自行聯系原作者