. 问题分析

1.1             现象描述

某企业客户内部知识管理系统基于微软SharePoint服务器产品并进行了应用扩展开发,NLB负载均衡部署,后台数据库采用SQL Server 2000 企业版,双核 4C 8G内存两节点群集。在两三年的使用过程中,随着系统用户的增多,出现了数据库服务器CPU占用过高的情况,导致前端访问响应速度慢,经常超时等问题。

1.2             性能计数器分析

用户连接

经过对SQL Server关键性能指标的采集和分析,发现用户连接指标数值过大。用户连接的数据基本保持在700-1000之间,不仅是在忙时段(AM:10),且在闲时段(PM: 6)也基本保持不变,基本可以确定是数据库连接池配置不当或有代码没有释放可用连接,需要通过应用代码进行问题排查。

锁请求/

经过向用户的了解,该系统为多数读取,少数写入的系统,但从性能计数器的观测值发现锁请求/秒的指标值平均约为158418.485,最高值可达到558870.266,锁操作总体过大,应该从应用层面进行分析优化。

完全扫描/

完全扫描/秒计数器指示有多少不使用索引而进行的全表扫描,测量过程中显示平均值达到100左右,最高值达到832.998,应分析SQL查询语句和数据库索引的对应关系,追加必要的索引以减少全表扫描的次数。

1.3             SQL工具分析

通过使用SQL 事件探查器和查询分析器等工具对SQL Server内部语句执行的性能状况列出了明细,并可将其中的CPU占用较高的任务列出,如第一行显示的大量数据连接导致CPU占用较高、第二行复杂子查询Join下存在部分索引未创建、wf_Instance_track表有大量过期的历史数据时变慢等问题。

1.4             应用代码分析

经过对系统源代码的粗略分析,发现以下一些问题:

a.                    SqlHelper中的GetConnection每次都是创建一个全新的数据库连接而返回给调用代码,导致连接无法被重用,每次全新创建也会增加服务器的负担;

b.                    SqlHelper中的TestConnection每次都是创建一个全新的数据库并且打开连接以测试连接的可用性,但是并不关闭就返回了。

c.                    AcceptUpdate中的SelectDb调用SqlHelper中的GetConnection获得连接后进行数据库查询操作,但使用后并不关闭相应连接

d.                   AcceptUpdate中的UpdateDs调用SqlHelper中的GetConnection获得连接后进行数据库更新操作,但使用后并不关闭相应连接

e.                    ColSelect.aspx中的btn_Ok_ServerClick调用SqlHelper中的GetConnection获得连接后进行数据库更新操作,但使用后并不关闭相应连接

2. 优化方案

2.1             代码优化

a.       由统一的代码管理数据库连接;

b.      使用数据库连接池技术管理连接;

c.       使用后必须关闭数据库连接;

d.      减少全新创建数据库连接的次数(如减少不必要的TestConnection操作)

e.       优化SQL语句,减少表锁;

f.       优化SQL语句,使查询能尽量使用索引,减少全表扫描;

g.      适当使用临时表,以减少SQL复杂度和子查询;

h.      其他与数据库性能有关的代码排查;

2.2             数据库优化

a.       创建经常被查询用到的索引;

b.      适当调整SQL 实例性能相关的参数,以使资源使用最大化(但要考虑为操作系统保留小部分资源);

c.       备份和分离过期的历史数据(如2006年的状态跟踪数据),并建立定期的数据库清理机制;

d.      定期观测和记录SQL性能计数器,了解性能状况变化;

e.       升级到更高版本的SQL Server 产品,使用分区表等新技术能够发挥更佳的服务器性能;

2.3             优化工作量估算

代码优化和测试验证:约需10-15个工作日(依原有代码质量和数量决定)

数据库优化和测试验证:约需5-7个工作日

3. 优化实施

3.1             代码优化

对代码结构进行了性能分析,发现了一些代码质量问题。

目录名

文件名

方法名

App_Code"Site

AcceptUpdate.cs

SelectDb

App_Code"Site

AcceptUpdate.cs

UpdateDs

FramePage

ColSelect.aspx.cs

btn_Ok_ServerClick

App_Code

SqlHelper.cs

GetConnection

分析、修改、部署共计3人天

注:尚未对存储过程进行优化

 

3.2             数据库优化

对执行性能差但使用频率较高的部分数据表进行了索引创建。

表名

索引列

索引名

分析、修改、部署和测试和报告共计5人天

4. 优化总结

4.1             性能对比

性能参考对象

优化前

优化后(闲)

优化后(忙)

说明

系统CPU利用率

86.235%左右

15.183%左右

45.583%左右

具体截图如下图1

完全扫描/秒

109.337左右

23.175左右

42.965左右

具体截图如下图2

锁请求/秒

158418.485

37101.090

69444.232

具体截图如下图3

索引搜索/秒

98472

25374

43653

具体截图如下图4

用户连接数

800-1200

541

820

4.2             待决问题

由于担心影响业务逻辑的正确性和测试的复杂性,没有对以下几个部分进行优化:

1.      数据库连接较多的问题,整体解决需要重新架构设计

2.      复杂度较高的SQL语句以及视图的优化

3.      存储过程的优化,防止表锁

4.      工作流引擎内部机制不了解

4.3             系统建议

数据库中表的数据量不是很大,单个简单的查询对整个系统的影响较小,较复杂的视图或存储过程优化有性能问题,随着数据量的增大影响而更明显,所以可定期清除不需要的历史数据。

4.4             总结

通过增加对数据量较大的表以及查询较频繁的表增加索引,能够减轻数据库完全扫描的压力,使CPU利用率下降。以上对比显示,优化效果较明显。

月华唐

转载于:https://www.cnblogs.com/Silverlight_Team/archive/2009/03/15/1412720.html

SQL Server性能优化案例报告相关推荐

  1. SQL Server性能优化与管理的艺术 附件下载地址

    首先感谢读者们对鄙人的支持,购买了<SQL Server性能优化与管理的艺术>,由于之前出版社的一些疏忽,附件没有上传成功,再次本人深表歉意. 请需要下载附件的读者从下面链接下载,谢谢: ...

  2. SQL Server 性能优化之——系统化方法提高性能

    原文 http://www.cnblogs.com/BoyceYang/archive/2013/06/15/3138142.html 阅读导航 1. 概述 2. 规范逻辑数据库设计 3. 使用高效索 ...

  3. SQL SERVER性能优化综述

    近期因工作需要,希望比较全面的总结下SQL SERVER数据库性能优化相关的注意事项,在网上搜索了一下,发现很多文章,有的都列出了上百条,但是仔细看发现,有很多似是而非或者过时(可能对SQL SERV ...

  4. SQL SERVER性能优化综述(转载)

    from:http://blog.csdn.net/Haiwer/archive/2008/08/25/2826881.aspx 近期因工作需要,希望比较全面的总结下SQL SERVER数据库性能优化 ...

  5. SQL Server性能优化

    http://blog.csdn.net/chyliu/archive/2007/11/06/1870539.aspx 如果你曾经做了很长时间的DBA,那么你会了解到SQLServe的性能调优不是一个 ...

  6. linux sql server调优,SQL SERVER性能优化(转)

    [IT168技术文档] 1. 用程序中,保证在实现功能的基础上,尽量减少对数据库的访问次数:通过搜索参数,尽量减少对表的访问行数,最小化结果集,从而减轻网络负担:能够分开的操作尽量分开处理,提高每次的 ...

  7. SQL SERVER性能优化-查询速度提高

    近段时间去面试,很多都会问到关于SQL语句优化及大数据量数据查询速度提升的问题,但是由于我个人之前开发都是一知半解的状态,很多东西都没能掌握明白,感觉自己就是菜鸟一枚,晕死,和朋友闲聊聊到查询效率的提 ...

  8. SQL SERVER 性能优化四: 创建分区表

    1.整体介绍 1.1 分区表概念:分区表值得是逻辑上是一个表,物理上被存储到不同的磁盘文件中. 1.2 优势:提高查询性能:提高稳定性:便于管理:对于大数据量表备份更方便. 1.3 建立分区表主要包含 ...

  9. MySQL优化之二:My SQL Server性能优化

    1 安装优化 一般说来,系统功能越多越复杂,性能就会越差.因此在编译安装MySQL时,仅安装需要的功能模块.如存储引擎.需要的字符集等,让系统尽可能的简单. 2 日志设置优化 由于日志记录直接带来的性 ...

最新文章

  1. 如何将struct System.Byte byte []转换为C#中的System.IO.Stream对象?
  2. [转载] FatFs模块功能配置选项
  3. python3.0与2.0,python3.0与python2.0有哪些不同
  4. JSON合并补丁程序:JSON-P 1.1概述系列
  5. vuex的计算属性_vue中vuex的五个属性和基本用法
  6. XML转换JSON格式
  7. steamcommunity302怎么用【使用方法】
  8. 华为2019年8月校招秋招笔试机考题解答C++实现
  9. 我的2019归零,2020走你
  10. 使用tftpd32烧写内核(拯救你的“砖”)
  11. 如何实现bat一键重启
  12. ionic platform add android环境搭建之难产【i1】【小白-2016.11.5】
  13. python京东抢购软件神器_用Python在京东抢购商品
  14. 计算机类在职研究生考试有哪些专业,计算机在职研究生考试科目有哪些?
  15. QAC分析常用qacli命令
  16. PostGIS教程二:PostGIS的安装
  17. [C和指针]笔记——01章~18章
  18. AI 安防「当打之年」,隐藏着哪些潜在独角兽
  19. java图书馆登陆代码_java控制台图书馆管理系统
  20. 将Unity官方射击游戏 Space Shooter 改为实时对战小游戏,使用天梯实时对战服务(NanoLink)

热门文章

  1. ewsa 字典_汉语字典小程序
  2. python教程七牛云_python-django框架中使用七牛云
  3. mgg mysql_MYSQL基础命令
  4. nvsip能用别的软件吗_为什么很多企业转向了 Golang? Java, Python, C#没落了吗?
  5. 计算机信息的编码教案,信息的编码教案信息的编码教案.doc
  6. 无法检测或故障_大众朗境挡位偶发缺失且无法启动
  7. edge新版 能够正则式_在最近的一项HTML5测试中,新版Edge浏览器表现满分
  8. vs 2012打包程序
  9. c#实现http文件下载
  10. java 抛出空指针_java - Java ServerSocket抛出空指针异常 - 堆栈内存溢出