博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQLServer性能优化一则小实例(2010-07-22)
阅读量:6929 次
发布时间:2019-06-27

本文共 1485 字,大约阅读时间需要 4 分钟。

今天下午优化了一个存储过程,通过sys.dm_exec_query_stats和sys.dm_exec_sql_text() 定位到的,发现运行次数虽然很少,但是每次却长达上千万毫秒的cpu消耗,但实际执行虽然时间比较久,却也不过几十分钟而已,不知道是不是SQLServer系统性能视图的缺陷。


既然有问题那就找吧

这是一个存储过程,类似于

create procedure sp_exec_task

as

declare cursor cur_test for select * from tableA

begin

open cur_test

fetch cur_test into ...

WHILE @@FETCH_STATUS=0   

BEGIN

  if true

    update tableB where id=tableA.id and other_cond

  else

    update tableB where id=tableA.id and other_cond

  if true

    update tableC where id=tableA.id and other_cond

  else

    update tableC where id=tableA.id and other_cond  

  fetch cur_test into ...

end

CLOSE cur_test

DEALLOCATE cur_test

end

怎么分析呢?

1、开始的时候是让游标空循环,发现一共1万多条记录,空循环时间基本为0

2、再次把所有的DML语句转化为SELECT,并记录每个步骤的运行时间和一次完整游标的循环时间

最后循环中变为

BEGIN

  print 'step 1'+convert(varchar,109,getdate()

  select * from tableB where id=tableA.id and other_cond

  print 'step 1'+convert(varchar,109,getdate()

  select * from tableC where id=tableA.id and other_cond

END

通过上百次的循环测试,发现每次循环大概需要60毫秒,100次的花就是6秒,10000次可不就是10分钟

3、检查了一下游标循环中用的表和where条件,发现选择性不错,就添加索引,再次安装上面的办法进行测试

这次是单次循环0~1毫秒,100次大概是1秒,10000次还是需要1分多钟的

4、1分多钟是可以忍受的,干脆直接测完吧,运行过程中,不断发现内存消耗极大,很快居然耗光了内存

5、添加了SET NOCOUNT ON之类的,运行后还是内存暴增

6、后来思考了一下是不是select * from tableB的不断刷新导致的,直接修改为

  select top 1 @tt=tt from tableB where id=tableA.id and other_cond

这样就不会持续刷新屏幕了

7、运行后,果然只需要短短的4秒钟。


总结:

其实在数据库中与性能相关的,无论是耗cpu还是耗内存还是耗硬盘还是锁的问题,分析到最后,95%以上都与SQL和索引相关

首先要找到问题,才能谈到分析问题,分析问题就在于多实践,而实践在于尽量屏蔽与问题无关的外界因素。

本文转自baoqiangwang51CTO博客,原文链接:http://blog.51cto.com/baoqiangwang/355716,如需转载请自行联系原作者

你可能感兴趣的文章
base64编码、解码的C语言实现
查看>>
HTML5中Access-Control-Allow-Origin解决跨域问题
查看>>
android: 服务的生命周期
查看>>
JBoss7安装、测试、配置和启动以及停止,部署
查看>>
[备忘]Redis运行出现Client sent AUTH, but no password is set
查看>>
PHP判断远程文件是否存在
查看>>
函数传递一维数组
查看>>
WebComponent魔法堂:深究Custom Element 之 从过去看现在
查看>>
Picard 法求方程根
查看>>
c语言中有bool型变量吗?
查看>>
Null值的使用
查看>>
《程序设计与数据结构》 课程教学
查看>>
注册asp.net
查看>>
java.net.ProtocolException: Exceeded stated content-length of: '13824' bytes
查看>>
详解Spring事件驱动模型
查看>>
内存分配有哪些策略
查看>>
WebView与JS的几种交互
查看>>
ffmpeg去logo<转>
查看>>
下载Tomcat时Tomcat网站上的core和deployer的区别
查看>>
imx6 关闭调试串口
查看>>