30分钟带你熟练性能优化的那点儿事儿(案例说明)

前言

  性能优化是数据库运维人员和中、高级软件开发人员的必备技能,很多时候老司机和新司机的区别就在写出的东西是否优化。

  博主接触过近千家客户的系统,这些系统都存在着各种各样的性能问题。那么如何透彻的了解我们的数据库性能问题?今天就用一个案例来说明性能优化的那点儿事儿。

  PS:很多技术人员对优化有一套自己的理解,在阅读本文前请放下你自己的理解。

  正所谓:跟着博主不迷路,博主带你上高速!

  点开案例跟着博主的思路看看优化这些事儿 : 本文案例Demo

  

了解系统环境

  优化首先要知道数据库在一个什么样的硬件/软件环境下运行?配置是怎么样的?内存、CPU这些是否能完全被应用?数据库体量多大?

  首先我们先看一下系统的配置:

  软件层面,我们要知道我们的操作系统版本,SQL Server版本,以及对应版本的硬件限制(如32位系统不开AWE无法使用超过4G内存、server 2008 标准版最大支持32G内存等)

  本例中我们可以看出,系统环境没有异常问题,SQL Server的补丁不是最新的,CPU资源不充足,可能CPU会成为系统的瓶颈。

全局层面看性能

  全局层面看问题主要指综合服务器的各种指标表象定位系统的瓶颈或问题,在性能优化中最忌讳的就是看到一个指标马上就下手,针对一个指标的判断是盲目的,很可能使问题偏离本身的根本原因,也可能使优化根本无法解决根本问题而只是表象得到了缓解。

 

性能计数器

  CPU:在大量时间内CPU的使用率达到100%,说明CPU已经成为瓶颈。

  

  内存:内存计数器生命周期在11点时已经降到0,惰性写入器也彪高,说明内存也存在压力,而且比较严重。

  

  磁盘:磁盘的平均队列很高(一般系统最佳情况队列应该低于2),并且读队列和写队列都很高。由于内存存在压力,所以现在无法判断磁盘的压力是由于内存不足引起的还是磁盘速度不能满足需要。

  

  其他计数器:

  可以看到系统中全表扫面的次数比较多,这表明很多查询没有应用索引。

  

  系统在11点左右和11点24左右发生大量锁等待,并且等待时间很长(超过150s)

  通过很多类计数器能综合看出系统的问题。这里不一一细说了

  

 

系统等待

  等待是另一个可以全局层面看系统的指标,系统运行的卡慢问题很大部分是因为等待而引起的,那么等待的类型也是可以很直观的反映出系统的问题。

  几个主要等待:  

  ASNC_NETWORK_IO:一般反应出有部分查询可能返回大量数据,请加查具体的等待语句是否需要返回如此多的数据。

  WAITFOR :可能是配置了CDC发布订阅或程序中使用了语句waitfor delay

  CXPACKET:CPU的调度等待。

  LCK_M_U :更新语句之间的语句阻塞。

  WRITELOG:说明程序中有循环的插入跟新操作而频繁的写入日志,磁盘速度不能满足写入频率而造成。

  

 

综合分析

  综合系统等待和性能计数器,我们基本可以判定出来系统存在以下问题:

  系统的CPU、内存、磁盘均存在较大的压力,尤其CPU负荷接近100%,系统中存在大量表扫面可能缺失比多索引。系统中有的语句可能要返回大量的不必要数据,系统锁情况严重,等待时间很长,语句执行时间也必然很长。

  语句执行的整体情况:由于上述的问题影响,那么系统中必然存在大量的长时间语句!

  

解决问题

  问题的定义是很重要的一步,从全局的多项指标综合分析,让所有问题无所遁形。定位问题后我们先来看一下解决这些问题的基本步骤。

  本案例是自己模拟的一个情况,所以虽然在表象上来看资源压力很大,但实际在运行的语句不多,场景也有限,但在生产系统如果存在这样的表象,那么说明你的系统性能问题非常严重急需一次详细的优化了。

  那么下面也介绍一下生产系统遇到这样的问题应该怎么优化,有哪些必要的步骤。

步骤一 针对系统问题对数据库进行全面的优化,提升整体效率

  很多人优化可能直奔语句,认为语句就可以解决性能的所有问题,其实这样的观点是不全面的,系统的配置,数据库的配置,索引的规划等都是解决性能的必要步骤。

  例如:系统中的语句都是最佳的,数据库运行还是很慢,可能就是因为你的CHECKDB配置的问题,也有可能因为你自动收缩没有关闭而导致的性能问题。

优化操作系统配置

  针对服务器进行配置检查,查看是否有配置不合理或可以优化的配置项,比如是否配置了虚拟内存?服务器层面是否限制的资源使用?服务器是否高性能模式运行?

优化数据库层面的配置

  针对数据库参数进行合理配置使硬件充分发挥硬件功能,优化不合理配置,降低对数据库造成冲击的可能性。比如:最大并行度?最大内存?

  

是否大量缺失索引

  大量索引缺失必然导致语句性能不佳,并且消耗大量的系统资源,很可能就会造成上面服务器高压力的表象

  

删除无用索引

  针对数据库中无用的索引进行删除。提升更新操作的时间。

删除重复索引

  针对数据库中重复的索引进行删除。提升更新操作的时间。

  

对重点语句建索引

  针对系统中消耗大的语句或执行次数多的语句进行分析,评估语句性能问题,并建立合适的索引提,降低语句的资源消耗,升语句运行效率。

解决阻塞

  解决语句间的阻塞,这需要分析语句的阻塞链,到底语句被什么样的操作阻塞了,为什么会阻塞?

  很多新手经常问的问题:为什么我有的时候查很快有的时候查就很慢? 答:大多数情况就是你的语句被阻塞了。

  

优化TempDB

  针对TempDB调优,减少TempDB资源争用导致的压力。本例中可以死看到有TempDB的争用等待,所以对TempDB的优化也是必要的。

优化日志碎片

  针对日志增大,带来的日志碎片问题进行优化。

清除索引碎片

  检查系统的索引维护情况,并针对碎片过大的表进行碎片清除操作。主要体现在系统中有老化的索引,索引的老化导致索引的性能不高或失效。

一阶段预期效果

  一阶段的优化是对性能的整体提升,性能提升也会很明显,针对不同系统提升一般在2-3倍。

步骤二 处理热点问题

  处理热点问题主要是在阶段一的基本优化后针对重点的语句进行调优,可能包含创建索引,修改写法,查询提示,计划向导等等。

  在语句调优中请主要关注:是否有缺失索引,是否存在隐式转换,语句的执行时间、CPU、逻辑读写量、物理读写量、占用TempDB空间等信息。

  例:这样一条语句经过第一阶段的优化并没有太大的提升,而且资源消耗依然很大,那么我们可以针对这条语句进行详细的二阶段优化。

 

 

简单的优化一下

   

  只是简单的改了下语句的写法时间有7秒变成1秒,内存消耗从300+MB 变成 1MB

二阶段预期效果

阶段二的优化属于细致的优化步骤,要针对更为具体的语句、具体的情况。经过本阶段优化可以使系统中大部分语句从写法、配置、运行指标都趋于优化值。

步骤三 针对业务

  这个步骤需要配合开发人员,到底哪些功能依然慢?执行了哪些语句?是领导用的功能?还是一般可以慢的功能?如果大领导用的功能,那可能你就需要多花些心思了。这部分这里就不展开说了。

三阶段预期效果

第三阶段属于最细致的阶段,可以结合业务真正点对点的消灭系统中存在问题。

导图

  针对性能优化奉上几个图希望能帮助数据库从业者梳理一下优化的思路(个人思路仅供参考,不完善的地方也请见谅)

  

CPU:

  

  内存:

  

  磁盘:

  

  等待:

  

总结

  在性能优化中最忌讳的就是看到一个指标马上就下手,针对一个指标的判断是盲目的,很可能使问题偏离本身的根本原因,也可能使优化根本无法解决根本问题而只是表象得到了缓解。

  本文只是通过一个例子简述一下优化的基本思路,希望帮助更多数据库从业者,了解性能优化。

  本文只阐述了思路,具体的各部分解决方式请参见我的系列文章:SQL SERVER全面优化-------Expert for SQL Server 诊断系列

  性能的调优是一个持续性的工作,不是一次解决了问题以后就可以高枕无忧了,定期的巡检也是数据库从业者必要的工作之一,做到及早发现及早解决。

  巡检系列文章请参见:轻松精通数据库管理之道——运维巡检系列

时间: 2024-08-08 13:22:16

30分钟带你熟练性能优化的那点儿事儿(案例说明)的相关文章

30分钟带你玩转正则表达式

        30分钟带你玩转正则表达式   定义: 正则表达式说白了就是有普通字符.以及特殊字符组成的文子模式.{匹配模式标准} 正则表达式将会作为一个模板与所搜索的字符串进行匹配.可以让使用者轻易达到搜寻/删除/取代某些特定字符的处理程序.此外vim.grep.find.awk.sed等命令都支持正则表达式 注:在这里希望大家搞明白一件事,那就是通配符和正则表达式的区别与关系: 1.正则表达式是用来匹配字符串的,这个就不解释了2.通配符是用来通配的,也就是shell在做Pathname E

Oracle数据库性能优化视频课程套餐(案例、实战、详细、全面)

套餐名称: Oracle数据库性能优化视频课程套餐(案例.实战.详细.全面) 套餐介绍: 风哥Oracle数据库性能优化培训套餐(案例.实战.详细.全面),包括内容: Oracle性能优化之执行计划管理.统计信息管理.性能诊断工具.性能跟踪工具.分区表管理.资源管理.操作系统工具.性能调整.物化视图.JOB自动任务管理等,套餐涉及10套课程,60个小时的课程,大量的案例. 套餐地址: http://edu.51cto.com/pack/view/id-974.html

蚂蚁金服架构师带你深入性能优化一MySql性能优化实战

概要: Mysql的优化,大体可以分为三部分:索引的优化,sql语句的优化,表的优化.本文主要帮助自己整理思路,也可作为一个学习MySQL优化的提纲. 索引的优化 只要列中含有NULL值,就最好不要在此例设置索引,复合索引如果有NULL值,此列在使用时也不会使用索引 尽量使用短索引,如果可以,应该制定一个前缀长度 对于经常在where子句使用的列,最好设置索引,这样会加快查找速度 对于有多个列where或者order by子句的,应该建立复合索引 对于like语句,以%或者'-'开头的不会使用索

30分钟带你快速入门MySQL教程

这是一篇真正适合初学者的MySQL数据库入门文章,哪怕你从来没有接触过数据库,或者说你从来没有听说过有数据库这东西,请一定要相信我,我当时就是这么过来的. 如果你刚开始接触MySQL数据库,或者你需要使用MySQL数据库来保存一些基本的数据,比如说,用户基本信息.学生基本信息表等,但却不知道何从下手,那么这篇文章就很适合你了,下面通过一个有趣的案例来带你熟悉MySQL的基本指令操作,希望你也能跟着操作,这样之后,相信你肯定就不会觉得很陌生了. 本文力图思路清晰和简洁,虽然有点长,但文字都是非常通

30分钟 带你浅入requirejs源码

因为最近项目想现实一个单页功能,用的是react ,然后看了一下react route,挖槽 gzip后16k? 然后我简单写了一个纯单页(不支持多页的单页,所有入口都经过rewrite跑到index.html) 才200多行(后续放github). 然后项目是用webpack打包的, 发现webpack的 require.ensure不支持变量加载的(至少暂时没发现), 就是意味着我有多小页面,就得在main(入口里配多小页面的关系)  这样挫,领导会喷我的. 然后我今天早上起来,想看看req

30分钟做一个二维码名片应用,有源码!

前言 30分钟带你用Wex5做一个微信公众号上使用的二维码名片,相应技术点有详细讲解,高清有码!(点击下载全部源码) 二维码现在是无处不在,无孔不入了.大到一辆汽车,小到一包纸巾,身上都印有二维码,明码标价.败家娘们可能会说:没想过要买的,真心的!就是看着漂亮嘛,想拍个照片,谁知道一拍就弹出个支付界面,想按退出但是手抖...(这手抖的,不知道放在菜刀下会不会稳定一点?)    作为个人信息的载体,名片也是天然适合二维码这种形式的.今天小茄就试着用WeX5移动开发工具做一个电子的二维码名片,除了扫

MYSQL之性能优化 ----MySQL性能优化必备25条

今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我 们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过 多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库.希望下面的这些优化技巧对你有用. 1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被

MYSQL性能优化分享(分库分表)

MYSQL性能优化之分库分表与不停机修改mysql表结构,需要的朋友可以参考下 1.分库分表 很明显,一个主表(也就是很重要的表,例如用户表)无限制的增长势必严重影响性能,分库与分表是一个很不错的解决途径,也就是性能优化途径,现在的案例是我们有一个1000多万条记录的用户表company,查询起来非常之慢,同事的做法是将其散列到100个表中,分别从company0到company99,然后根据id分发记录到这些表中,牛逼的代码大概是这样子: 复制代码代码如下: <?php for($i=0;$i

( 转)从四分钟到两秒——谈谈客户端性能优化的一些最佳实践

转:http://www.cnblogs.com/marvin/p/WinformOptimizSkill.html 背景 最近跟售后经理吃饭,他跟我再次谈起两年前为公司临时写的一个客户端,仍然非常激动的跟我说,这个客户端完爆了公司其他版本的客户端,包括最老的Delphi写的,Asp.Net写的,以及最新的Wpf写的客户端.无论是多么大的界面(集成的机房多),这个系统都是瞬间打开,而且运行非常稳定,一旦成功部署之后基本没有任何问题. 这个版本的客户端仅仅只是一个临时替代的版本:原来的Delphi