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

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:
今天下午优化了一个存储过程,通过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,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
10月前
|
SQL 存储 监控
sqlserver触发器详解:sqlserver触发器after/for和instead of的区别详解(实例讲解),触发器定义创建操作打通,触发器的优缺点,触发器使用建议
sqlserver触发器详解:sqlserver触发器after/for和instead of的区别详解(实例讲解),触发器定义创建操作打通,触发器的优缺点,触发器使用建议
1264 1
|
SQL 安全 关系型数据库
解决 | 此数据库文件跟当前sql server实例不兼容 & sql server2008无法连接到(local)
最近在搞ASP.NET,因实验室VS版本跟PC不一样可能,拷回来一打开就这样子: 眉头一皱的我打开我的古董SQL,自从用了MySQL就没碰它了我的锅。
1303 0
|
SQL 关系型数据库 数据库
MSSQL-最佳实践-实例级别数据库上云RDS SQL Server
--- title: MSSQL-最佳实践-实例级别数据库上云RDS SQL Server author: 风移 --- # 摘要 到目前,我们完成了SQL Server备份还原专题系列八篇月报分享:三种常见的数据库备份、备份策略的制定、查找备份链、数据库的三种恢复模式与备份之间的关系、利用文件组实现冷热数据隔离备份方案、如何监控备份还原进度、阿里云RDS SQL自动化迁移上云的一种
1728 0
|
SQL Go
SQL SERVER GO命令循环使用实例
原文:SQL SERVER GO命令循环使用实例 通过GO  命令 来达到语句循环效果  也叫批循环 print '输出10次' GO 10  也可用来新增 语句  NOCOUNT ON 用来屏蔽 新增语句输出的影响行数 我们只看循环次数 SET NOCOUNT ON; GO INSERT INTO dbo.
643 0
|
SQL 关系型数据库 数据库
MSSQL · 最佳实践 · 实例级别数据库上云RDS SQL Server
摘要 到目前,我们完成了SQL Server备份还原专题系列八篇月报分享:三种常见的数据库备份、备份策略的制定、查找备份链、数据库的三种恢复模式与备份之间的关系、利用文件组实现冷热数据隔离备份方案、如何监控备份还原进度、阿里云RDS SQL自动化迁移上云的一种解决方案以及上个月分享的RDS SDK实现数据库迁移上阿里云,本期我们分享如何将用户线下或者ECS上自建实例级别数据库一键迁移上阿里云RDS SQL Server。
1953 0
|
SQL 缓存 数据库
SqlServer性能优化之获取缓存的查询计划中的聚合性能统计信息
SqlServer性能优化之获取缓存的查询计划中的聚合性能统计信息
4296 0
|
SQL 测试技术 网络安全
利用PowerUpSQL攻击SQL Server实例
  这篇博客简述如何快速识别被第三方应用使用的SQL Server实例,该第三方软件用PowerUpSQL配置默认用户/密码配置。虽然我曾经多次提到过这一话题,但是我认为值得为这一主题写一篇简短的博客,帮助大家解决常见的问题。
1616 0
|
SQL Windows
单用户模式启动SQL Server实例总结
原文:单用户模式启动SQL Server实例总结   在SQL Server的数据库维护过程中,有时候在一些特殊情况下需要在单用户模式下启动SQL Server实例。 下面总结一下单用户模式启动SQL Server的几种方式:   1:命令模式(sqlservr.exe)启动   首先在命令窗口中切换到Binn目录(这个要视SQL Server实际安装路径情况而定,另外,多实例情况下,必须切换到对应路径),如果你对sqlservr.exe命令不熟悉,可以查看相关帮助信息。
1335 0
|
索引
SqlServer性能优化之获取表的数据行数,数据大小,索引大小等
SqlServer性能优化之获取表的数据行数,数据大小,索引大小等
11118 0
|
SQL 数据库
SQL Server 命名实例更改端口进行发布订阅
原文:SQL Server 命名实例更改端口进行发布订阅 两台数据库服务器,都没有加入域,都安装多实例,端口也不一样了。现在使用命名实例进行复制,折腾了好久,才发现解决方法。 服务器A:myserverA MSSQL命名实例: mymssql MSSQL端口:14433 服务器B:m...
1264 0