前言

  最近连续接触了4个OA系统,均存在着不同的性能问题,本文记述对某移动OA系统的优化全过程,让看官们对数据库优化流程有一个了解,并揭开隐式转换这无情杀手的神秘面纱。

  本文使用的工具:SQL专家云平台专业体检工具 :www.zhuancloud.com

系统情况

  硬件配置

  

  

  软件情况

  

  数据库情况

  

  系统情况可以看出,这是一个较小型的OA系统数据大小70G,硬件配置较为普通2路16CPU、48G内存,数据库为2008R2版本。

数据库指标

  我们来看一下数据库的性能相关情况:数据是从早上九点半到晚上8点的数据

  每秒请求数:

  

  用户连接数

  

  慢语句数量

  

  系统等待情况

  

  等待时间

  

  

  CPU、内存、磁盘指标一切正常,还有很多指标,这里就不贴图了。

  其实看到这里,大多数看官可以得出结论,硬件指标正常,阻塞这么严重,系统的慢主要是因为阻塞!并且语句运行时间长也是因为阻塞的时间长!

  我的猜测

  OK 没问题就是这样的定位,同样我们看到大量的阻塞类型是LCK_M_IS、LCK_M_S、LCK_M_U ·····有了这样的定位,我可以猜测到,系统中一定有update语句不优化或太过频繁(OA这样的系统一般不会特别频繁,所以一定是不优化),而且设计核心的查询语句经常被阻塞(如果不是核心功能慢,用户也不会这样大叫!),而且80%的可能这部分核心查询也不够优化!

问题诊断

  带着我的猜测我们看一下核心的一些语句:

  

  很多语句都类似,看到这样的简单语句(都是基本的查询几个字段一个where条件),我就知道问题其实一定很简单!

  如此简单的语句设计那么跑出来是多长时间呢?

  

  很多人想到着一定是缺失索引,这样关键的where 条件上没有索引!!!!!

  看一下结构:

  

  

  这个表是一个有280万数据的表,而不是像我们想象的那样缺失索引,相反where字段上的条件是一个聚集索引!!(其实如果只是条件单纯的缺失索引,技术人员怎么可能发现不了?)

  整个系统其他问题不大,也就是说明,系统经过优化,程序设计的也很好,没有那种非常复杂的SQL,都是拆成一步一步很简单SQL,也就是说明这其中的技术人员水平还是很可以的!

  那么问题来了,这是啥问题导致的?

  可能出现的情况是:

  1.我这条简单语句不缺少索引,而且单独在数据库跑很快很快(这是一定的)

  2.我系统中阻塞的这么严重,是不是有什么地方我没发现?怎么这样的语句会阻塞的这么狠?

  3.是不是我服务器有什么问题了?

  

  在创意粘性的一本书中写到“指挥官意图”相关,其中有一个比喻就和这个很接近,如果排除其他干扰,就只是看这样简单的语句为什么慢?这样我们就是意图明确,排除干扰,很快我们就会想到“隐式转换”导致索引不能使用的情况,但是正是因为上面的一些问题干扰,我们可能会被引导到,是不是服务器的问题,是不是阻塞情况我们有分析清呢?没有太多办法,数据库本身就是这样一个复杂的东西,各种因素的组合排查是最考验从业者的智慧的。

  回到正题,“隐式转换”确实是一个写程序的人员很难发现的东西,因为我写出的语句很快,到数据库跑的时候慢,这我可不知道。

  如果不知道什么是隐式转换,请参见:SQL SERVER中隐式转换的一些细节浅析

  但我们通过工具很清楚的分析出“隐式转换”

  

  

  在之前的表定义中,我们可以看出表的字段类型为varchar,而传入的参数是nvarchar(从隐式转换的提示中得知)

  

  支持一个简单的问题得到定位,解决起来也是非常容易的,下面给出几个隐式转换的常见解决方式:

  1.程序定义字段类型与表定义不相符(优先级高于表定义类型),直接修改参数设定类型

  2.程序没有定义类型比如java程序定义string ,而驱动自动翻译成nvarchar ,这样一般可以在程序加入强制转换 如 “where a = @a ” 改写成 “where a = cast(@a as varchar(自定义长度))”

  3.程序如果很难修改,或第三方开发,可以直接修改表字段类型

性能对比

  经过1天的简单优化程序性能得到明显改善

  优化前

  

  优化后

  

  优化前

  

  优化后

  

--------------博客地址---------------------------------------------------------------------------------------

博客地址 http://www.cnblogs.com/double-K/

 

欢迎转载,请注明出处,谢谢!

-----------------------------------------------------------------------------------------------------

  总结 : 文章只是简单的描述了一下某移动公司OA优化的过程,主要讲述了隐式转换部分的发现与处理,其他部分的优化都是常见手段请参见其他文章。

    SQL SERVER全面优化-------Expert for SQL Server 诊断系列

  

    关于隐式转换的文章:SQL SERVER中隐式转换的一些细节浅析

----------------------------------------------------------------------------------------------------

注:此文章为原创,欢迎转载,请在文章页面明显位置给出此文链接!
若您觉得这篇文章还不错请点击下右下角的推荐,非常感谢!

性能优化实战案例——助力某移动OA系统的更多相关文章

  1. 小程序Canvas性能优化实战

    以下内容转载自totoro的文章<小程序Canvas性能优化实战!> 作者:totoro 链接:https://blog.totoroxiao.com/canvas-perf-mini/ ...

  2. Linux性能优化实战(一)

    一.优化方向 1,性能指标 从应用负载的视角出发,考虑"吞吐"和"延时" 从系统资源的视角出发,考虑资源使用率.饱和度等 2,性能优化步骤 选择指标评估应用程序 ...

  3. 网站性能优化实战——从12.67s到1.06s的故事

    文章摘自https://juejin.im/post/5b0b7d74518825158e173a0c 作为互联网项目,最重要的便是用户体验.在举国“互联网+”的热潮中,用户至上也已经被大多数企业所接 ...

  4. Golang 性能优化实战

    小结: 1. 性能查看工具 pprof,trace 及压测工具 wrk 或其他压测工具的使用要比较了解. 代码逻辑层面的走读非常重要,要尽量避免无效逻辑. 对于 golang 自身库存在缺陷的,可以寻 ...

  5. 我把阿里、腾讯、字节跳动、美团等Android性能优化实战整合成了一个PDF文档

    安卓开发大军浩浩荡荡,经过近十年的发展,Android技术优化日异月新,如今Android 11.0 已经发布,Android系统性能也已经非常流畅,可以在体验上完全媲美iOS. 但是,到了各大厂商手 ...

  6. Linux性能优化实战学习笔记:第五十六讲

    一.上节回顾 上一节,我带你一起梳理了,性能问题分析的一般步骤.先带你简单回顾一下. 我们可以从系统资源瓶颈和应用程序瓶颈,这两个角度来分析性能问题的根源. 从系统资源瓶颈的角度来说,USE 法是最为 ...

  7. Android UI性能优化实战, 识别View中的性能问题

    出自:[张鸿洋的博客]来源:http://blog.csdn.net/lmj623565791/article/details/45556391 1.概述 2015年初google发布了Android ...

  8. Android UI性能优化实战 识别绘制中的性能问题

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45556391: 本文出自:[张鸿洋的博客] 1.概述 2015年初google ...

  9. 《Linux 性能优化实战—倪朋飞 》学习笔记 CPU 篇

    平均负载 指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,即平均活跃进程数 可运行状态:正在使用CPU或者正在等待CPU 的进程,也就是我们常用 ps 命令看到的,处于 R 状态 (Run ...

随机推荐

  1. Android SystemProperties设置/取得系统属性的用法总结

    通过调查得知,Android系统中取得/设置系统属性的用法参考以下3篇文章就足够了. 1.Android SystemProperties简介 介绍了设置属性需要的权限,已经设置权限的方法. Syst ...

  2. ural1494 Monobilliards

    Monobilliards Time limit: 1.0 secondMemory limit: 64 MB A monobilliards table set up in a gaming hou ...

  3. Cocos2dx 学习笔记整理----开发环境搭建

    最近在学习cocos2dx,预备将学习过程整理成笔记. 需要的工具和环境整理一下: 使用的版本 cocos2dx目前已经出到了v3.1.1,学习和项目的话还是用2.2.3为宜,毕竟不大想做小白鼠,并且 ...

  4. openstack controller ha测试环境搭建记录(十五)——创建实例

    # source demo-openrc.sh # ssh-keygenGenerating public/private rsa key pair.Enter file in which to sa ...

  5. CodeForces 618C CodeForces 618C

    第一反应是在凸包上随便找一条边,然后找剩下n-2个点里面距离这条边最短的一个点,这三点就构成了符合要求的三角形..然而..精度被卡死. 换种思路,随便找两个点P1,P2,找剩下n-2个点中哪一个点与P ...

  6. fedora安装各种应用软件

    1 安装视频播放器 sudo yum install mplayer mplayer-gui 可以从命令行 和 gnome 中启动 2 音量调节 (1)使用 alsamixer alsamixer是一 ...

  7. php上传zip文件在线解压文件在指定目录下,CI框架版本

    我从网上找的文件php在线解压zip压缩文件 文件为jy.php可以直接执行,但是怎样将其加到CI框架中呢?? jy.php文件 <?php header("content-Type: ...

  8. MySQL远程登陆错误

    远程连接 mySql数据库会提示10061.1045错误或 2003-Can’t connect to MySQL on ’192.168.1.2’(10061),这个原因是因为MySQL不准许远程连 ...

  9. SVN简单流程---以公司的使用方法为例

    一  名词解释 svn一般包括      branch  每个branch版本都要生成对应的tag.例如 branch版本号为1.0.0,那么提交后生成的tag版本号为1.0.0.0;当branch修 ...

  10. SocketChannel

    Java NIO 中的 SocketChannel 是一个连接到 TCP 网络套接字的通道.可以通过以下 2 种方式创建 SocketChannel: 打开一个 SocketChannel 并连接到互 ...