天天看点

同样功能的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语句,执行效率相差那么大拉?