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

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介:
今天下午优化了一个存储过程,通过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
相关文章
|
5月前
|
SQL 存储 安全
sql server 数据库实例
SQL Server 数据库实例是指在 SQL Server 中创建的一个独立的数据库环境。每个数据库实例都拥有自己的一套完整的数据库文件、配置设置、用户和权限等,可以独立地进行管理和操作。以下是关于
|
3月前
|
SQL Java 关系型数据库
应用DriverManager类创建sqlserver数据库连接实例 JSP中使用数据库
该博客文章介绍了在JSP中使用JDBC连接SQL Server数据库的方法,包括加载数据库驱动、建立数据库连接的过程,并提供了一个使用DriverManager类创建数据库连接的Java示例代码。
|
5月前
|
SQL 弹性计算 数据管理
数据管理DMS产品使用合集之sql server实例,已经创建了数据库,登录时提示实例已存在,该怎么处理
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
57 1
|
4月前
|
SQL 存储 数据库
SQL Server性能优化策略与实践
在使用Microsoft SQL Server(简称MSSQL)进行数据库管理时,性能优化是确保系统高效运行、提升用户体验的关键环节
|
6月前
|
SQL 关系型数据库 数据库
阿里云数据库 RDS SQL Server版实战【性能优化实践、优点探析】
本文探讨了Amazon RDS SQL Server版在云数据库中的优势,包括高可用性、可扩展性、管理便捷、安全性和成本效益。通过多可用区部署和自动备份,RDS确保数据安全和持久性,并支持自动扩展以适应流量波动。可视化管理界面简化了监控和操作,而数据加密和访问控制等功能保障了安全性。此外,弹性计费模式降低了运维成本。实战应用显示,RDS SQL Server版能有效助力企业在促销高峰期稳定系统并保障数据安全。阿里云的RDS SQL Server版还提供了弹性伸缩、自动备份恢复、安全性和高可用性功能,进一步优化性能和成本控制,并与AWS生态系统无缝集成,支持多种开发语言和框架。
413 2
|
SQL 存储 监控
sqlserver触发器详解:sqlserver触发器after/for和instead of的区别详解(实例讲解),触发器定义创建操作打通,触发器的优缺点,触发器使用建议
sqlserver触发器详解:sqlserver触发器after/for和instead of的区别详解(实例讲解),触发器定义创建操作打通,触发器的优缺点,触发器使用建议
2345 1
下一篇
无影云桌面