关于Display Estimated Execution Plan的两个问题

oicqhf 2011-04-29 11:24:45
1、实现相同功能的不同SQL语句,分析出来的Estimated Operator Cost是不是一定是越小越好呢?

2、为什么我使用参数和使用值来分析相同的SQL语句,得到的执行计划是不同的呢?
例如:
Declare @Id uniqueidentifier
Set @Id = 'GUID'
Select * from table t1
inner join table t2 on ... and t1.Id = @Id
inner join table t3 on ...
where Id = @Id and ...



Select * from table t1
inner join table t2 on ... and t1.Id = 'GUID'
inner join table t3 on ...
where Id ='GUID'and ...

得到的执行计划不同,为什么呢?不适用参数设置的,在执行计划中可以看到有Key Lookup操作,而使用参数设置的就不会有这步操作。并且不适用参数设置的Estimated Operator Cost只有使用参数设置的2%左右,运行起来也是有明显的性能差别。

希望得到各位的指点,多谢!
...全文
132 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
oicqhf 2011-05-10
  • 打赏
  • 举报
回复
终于在《SQL Server 2008查询优化》中找到了答案,如果使用参数的话,优化器就会将这个参数作为局部变量使用,而在不知道局部变量的具体值的时候,优化器无法得到准确的优化分析,所以得到的执行计划是不同的。

使用了局部变量后,也会是Estimated Cost变得不是十分准确,因为可能只是分析器估计的结果,和实际的结果会有一定的差距。

尽管没有得到想要的答案,但还是感谢楼上二位的回复。
rucypli 2011-05-02
  • 打赏
  • 举报
回复
使用参数得话可能没有重用了执行计划,需要时间重新编译sql
oicqhf 2011-05-01
  • 打赏
  • 举报
回复
多谢fredrickhu的回复。

不过我还有些不太明白,为什么调用参数会有这么大的开销呢?

我做了测试,用参数的形式从50w条记录中搜索3000条数据,如果使用参数大概是5s左右,而不使用参数只需要几百毫秒,而且更奇怪的是,只有一个参数会导致这个情况的出现,我试了其它几个参数都没有类似的问题。

还有,如果我在.net中使用Parameters.Add的方式给参数赋值,这样也会有你说的那些额外的开销吗?

再次感谢,只是希望能了解的更详细些。
--小F-- 2011-04-29
  • 打赏
  • 举报
回复
1.预估花费只是一个粗略的评估,可以做为参考,但还需要具体情况具体分析

2.使用参数以后,每次查询语句匹配的时候还需要先调用参数,增加了额外的开销
oicqhf 2011-04-29
  • 打赏
  • 举报
回复
没人知道吗,大家是怎么分析SQL语句的性能的呢?

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧