[SQL Server 2005/2008]参数嗅探问题 (性能优化)

 源自《Microsoft SQL Server 2005技术内幕:T-SQL程序设计》7.4 编译、重新编译和重用执行计划

 

 

 

 

示例如下:(表orders 的第一个字段"orderdate datetime"上建有索引), 第1个存储过程生成的执行计划是“全表扫描”,第2,3个生成的是“索引扫描”,推荐第3种。

create proc p_getorders_1

@d as int = 0

as

declare @odate as datetime;

set @odate = dateadd(day, -@d, convert(varchar(8), getdate(), 112));

select orderid, customerid, employeeid, orderdate from orders

where orderdate >= @odate;  --这个是局部变量

go

 

create proc p_getorders_2

@d as int = 0

as

select orderid, customerid, employeeid, orderdate from orders

where orderdate >= dateadd(day, -@d, convert(varchar(8), getdate(), 112)); --这个是传入参数的计算表达式

go

 

create proc p_getorders_3

@odate as datetime

as

select orderid, customerid, employeeid, orderdate from orders

where orderdate >= @odate; --这个是传入参数

go

 

      查询优化器“知道”输入参数的值,就能够生成适合该输入的执行计划;然而,当查询中引用局部变量时,查询优化器无法“嗅探”出变量的内容,当它在优化查询计划时,它必须猜测。这些局部变量是在批处理中还是在存储过程中都无关紧要。

 

很明显,如果你不了解这个问题而且没有采取纠正措施将导致性能低下的计划。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值