<script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>今天写一个存储过程,由于执行的时间比较长(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
FROMfinance_budget_account
WHEREbudget_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
FROMfinance_budget_account
WHERE(budget_type='电路租费'))
比较这两段SQL.我们只是将其中的一个字符串'3810'写成了参数的形式,但是执行的效率就完全不一样了.
第二种SQL语句花费了7秒钟的时间.
为什么同样的SQL语句,执行效率相差那么大拉?
现在有一个表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
FROMfinance_budget_account
WHEREbudget_type='电路租费')
但是如果改成了如下的代码:
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
FROMfinance_budget_account
WHERE(budget_type='电路租费'))
第二种SQL语句花费了7秒钟的时间.
为什么同样的SQL语句,执行效率相差那么大拉?
本文探讨了一种奇怪的SQL查询现象:直接使用字符串字面量的查询效率远高于使用变量的查询效率,即使两者表面上看起来相同。通过对比两种查询方式,分析了潜在的原因,并提出了可能的解决方案。
2171

被折叠的 条评论
为什么被折叠?



