MicroHelper.Net

雷锋说.对待朋友要MicroHelper,对待敌人要害尔扑
随笔 - 74, 评论 - 431, 引用 - 7

导航

工具

关于

邮件系统不稳定,使用songdming at 263 dot net吧
PageRank

FastCounter by bCentral

 

标签

每月存档

广告



访客

 

在优化一段sql的时遇到性能问题,sql结构如下

create table #report (...)

insert #report (...)
select ..., fnGetDate(OrderDate) as OrderDate
from ...
where ...

数据量非常小,执行时却发现执行非常慢,大大超过预期。查看执行计划发现table spool/eager spool的时间占了99%,后来发现,如果去掉insert,只执行select,速度相差20倍,就认为这是问题的根源。

想了很多办法来优化速度,比如用表变量替换临时表,直接insert,加top 10000000,用实际的表换掉临时表等等,不见效果。后来逐个字段检查,发现加上OrderDate,性能马上就降下来了。

fnGetDate是一个格式化时间的函数(虽然一般来说格式化的工作不应该在sql中处理,但是这个例子是需要的),目的是把把时间格式化成2004-Nov-01这样格式,后来确定可以应用2004-11-01这种格式,但是有的地方没有改过来,比如这里。

问题找到,把fnGetDate换成convert,速度马上提高20倍。但是问题还不算解决,其他的很多地方都用到了fnGetDate,但是速度没有太大影响,应该还有其他的原因。

后来发现一个现象,加top 10000000与不加两种对比,速度相差7倍,应该还是查询写的有问题,有的地方没有用到索引。经过一番调整后系统恢复正常运行。这时候再把convert换回fnGetDate速度没有太大的变化。

sql server的执行计划虽然会告诉我们我们一个sql执行的详细情况,但是只看表面现象有时候容易差生误导,比如上面的例子,一般来说sql的性能问题大部分由于查询设计的不合理和Index不合理以及资源锁定造成的,发现问题应该首先分析这几方面。

函数确实对性能是有影响的,但是加了函数以后对sql执行造成这么大的影响还是第一次碰到。

相关文章

打印 | 张贴于 2004-11-16 16:12:00 | Tag:暂无标签

留言反馈

#re: sql优化 编辑
text
2004-11-20 12:06:00 | [匿名用户:text]
#re: sql优化 编辑
另外,top影响性能很可能跟统计因子有关系
2004-11-17 15:20:00 | [匿名用户:怡红公子]
#re: sql优化 编辑
用词错误,不是并发,是多线程

关于top的问题,这个得看执行计划了
2004-11-17 15:18:00 | [匿名用户:怡红公子]
#re: sql优化 编辑
应该不会有并发的问题,当时没有别的进程在用数据库,也没有自关联的的join

怎么检查并发比较有效呢?

还有一点感到有点疑惑,以前在子查询里面写top 以影响sql的执行计划来优化性能,为什么在整个查询的前面加top 关键字也会影响执行,从而产生7倍的速度差别呢?


2004-11-16 18:12:00 | [匿名用户:microhelper]
#re: sql优化 编辑
不是lock,是latch,比lock层次低
你怎么检查并发的?
2004-11-16 17:47:00 | [匿名用户:怡红公子]
#re: sql优化 编辑
检查过并发和lock,没有发现什么太大的问题。

后来发现未优化以前,加函数和不加函数的执行计划是不一样的,执行时间差20倍,调整index后执行时间只差一点点了。

看来还是不用函数保险一点。
2004-11-16 17:01:00 | [匿名用户:microhelper]
#re: sql优化 编辑
确实,不能倚赖于showplan

不过遇上执行计划的预期开销不大,而实际执行时间长
可以检查并发和latch

顺便说一下,yukon由于重写SQL OS,这方面有了不少提高
2004-11-16 16:27:00 | [匿名用户:怡红公子]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode MVC Blogger System