当前位置: 首页 > news >正文

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和索引相关
首先要找到问题,才能谈到分析问题,分析问题就在于多实践,而实践在于尽量屏蔽与问题无关的外界因素。


相关文章:

  • linux和windows的文本编码 centos5.5-启动器
  • 记录清除免疫插件
  • java发邮件22
  • 2010.8.1 Unicode编程
  • 《Microsoft Sql server 2008 Internals》读书笔记--第十一章DBCC Internals(6)
  • Dashboard,新时代的报表
  • 最大乘积——高精度乘法
  • ZT:判断链表是否有环以及环的入口点
  • mfs 测试实验--环境搭建
  • linux 入门学习
  • 报ERROR: Fast Data Access MMU Miss 错误解决思路
  • ASP.NET获取当前网址方法
  • 如果你已经20岁了,你真的输不起了,别再孩子了.....
  • SQL的语法和规则
  • 漫谈VoIP技术 H.323与SIP比较分析
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • canvas 高仿 Apple Watch 表盘
  • Fabric架构演变之路
  • HTML5新特性总结
  • jQuery(一)
  • Material Design
  • Python_网络编程
  • Spring Cloud Feign的两种使用姿势
  • springboot_database项目介绍
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 成为一名优秀的Developer的书单
  • 从重复到重用
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 浮现式设计
  • 构造函数(constructor)与原型链(prototype)关系
  • 关于Flux,Vuex,Redux的思考
  • 关于List、List?、ListObject的区别
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 前端知识点整理(待续)
  • 责任链模式的两种实现
  • 自动记录MySQL慢查询快照脚本
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​学习一下,什么是预包装食品?​
  • $().each和$.each的区别
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (二)linux使用docker容器运行mysql
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (一)kafka实战——kafka源码编译启动
  • (转)创业家杂志:UCWEB天使第一步
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .aanva
  • .net 4.0发布后不能正常显示图片问题
  • .net core Swagger 过滤部分Api
  • .net core开源商城系统源码,支持可视化布局小程序