开发者社区> 技术小美> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

SQLServer性能优化一则小实例(2010-07-22)

简介:
+关注继续查看
今天下午优化了一个存储过程,通过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,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Python3 编程实例(21 - 25)
Python3 编程实例(21 - 25)
44 0
SQL SERVER 2014 Agent服务异常停止案例
原文:SQL SERVER 2014 Agent服务异常停止案例    生产环境一数据库服务器(SQL Server 2014)的Agent服务突然停掉了,检查了错误日志,发现在"SQL Server Agent"里面没有"SQLServerAgent terminated (normally)"的信息,只有如下错误信息   根据作业运行的日志信息,以及上面错误信息,可以判断SQL SERVER Agent服务应该在2016-04-24 9:20: PM(21:20)异常停止了。
741 0
登录到 SQL Server 实例
登录到 SQL Server 实例(命令提示符)       登录到 SQL Server 的默认实例 从命令提示符输入以下命令,使用 Windows 身份验证进行连接:     sqlcmd [ /E ] [ /S servername ] 登录到 SQ...
617 0
SQL Server 2012 新特性:服务角色管理
数据库角色管理,已经可以使用alter role,create role和drop role。 2012增加了几个ddl语句,可以操作服务级别的角色管理,   CREATE SERVER ROLE 用来创建服务级别的role。
776 0
第十七章——配置SQLServer(4)——优化SQLServer实例的配置
原文: 第十七章——配置SQLServer(4)——优化SQLServer实例的配置 前言: Sp_configure 可以用于管理和优化SQLServer资源,而且绝大部分配置都可以使用SQLServer ManagementStudio的图形化界面实现。
857 0
SQL Server 2012 复制(发布订阅的研究)
原文:SQL Server 2012 复制(发布订阅的研究) 已实现发布订阅功能,可以实现局域网内双击备份。 一、注意事项: a) 使用【事务复制】功能 b) 必须是相同的SqlServer 帐号和密码 c) 要开始发布订阅时,有时需要在发布里【查看快照代理状态】,点击【启动】 d) 服务...
975 0
+关注
6819
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载