现在很多用户被数据库的慢的问题所困扰,又苦于花钱请一个专业的DBA成本太高。软件维护人员对数据库的了解又不是那么深入,所以导致问题迟迟不能解决,或只能暂时解决不能得到根治。开发人员解决数据问题基本又是搜遍百度各种方法尝试个遍,可能错过诊断问题的最佳时机又可能尝试一堆方法最后无奈放弃。

    怎么样让琐事缠身的程序维护人员,用最快的方式解决数据库出现的问题?怎么让我们程序员的痛苦降低到最小...每天喝喝茶水,看看新闻平安度过一天呢?本系列重要通过Expert for sqlserver工具讲解下数据库遇到的各种问题的表象及导致这样问题的根本原因,让定位问题更准确,解决问题思路更清晰!!

    数据库的性能好坏,对于最终用户来说表现为点击的操作是否能够快速响应,那么反应到数据库上就是语句执行时间是否够短!

    对用运维人员数据库性能的表现,简单可能看成CPU 、内存、磁盘三巨头指标是否正常,上一篇讲述了CPU的基本诊断

Expert 诊断优化系列------------------你的CPU高么?

    本篇我们就从内存下手,看看内存能够看出哪些问题!

废话不多说,直接开整-----------------------------------------------------------------------------------------

    首先说明一个误区,你是否被这样的画面所震惊?

    

    我的服务器内存满了,就是这个导致我数据库慢!我的程序报错也是因为这个,什么都因为内存满了!!  赶紧加内存吧~

    这个答案是大写的 “不一定”,SQL SERVER是一个很爱内存的家伙,他会缓存你的数据,执行计划,连接信息等等,所以出现这个现象是很正常的,不要轻易下结论,除非你经过仔细的研究和分析!

    那么怎么去分析到底是不是内存不足导致的问题呢?  下面我们来说说!

主要用到的性能计数器(不知道什么是性能计数器的,请自行百度)

  1. Page life expectancy (数据库计数器:主要显示不被使用的页,将在缓存中停留的秒数 )
  2. Lazy writes/sec  (数据库计数器:惰性写入器会在内存有压力且有新的内存需求时触发,成批的刷新“老化的缓冲区”)
  3. Page Reads/sec,Page Writes/sec  (这里使用数据库级别计数器:当需要读取或写入的页不在内存中,需要到磁盘中读取时计数)
  4. Target Server Memory (KB)  (SQL server能够使用的内存总量)
  5. Total Server Memory (KB)  (SQL SERVER使用的内存总量,这里指BUFFER POOL的大小)
  6. Available MBytes  (系统系数器:主要显示系统还有多少可用内存)

  注:Target Server Memory (KB) - Total Server Memory (KB) 约等于SQL SERVER还可以使用的内存数。

  Available MBytes 主要显示系统中还多少空闲内存 (如果这个值较大,而SQL SERVER还可以使用的内存数为0或者较小,可以适当的调大max server memory(最大内存,稍后介绍))

    

   这里不再细说这三个计数器,我们主要通过前三个计数的联动来判断系统的内存是否真的存在压力!!!

   首先介绍一下,这三个计数器是如何联动的?

   概念出发:Page life expectancy 不被使用的页在缓存中停留的秒数,如果低说明内存压力

        Page Reads/sec 所要读的数据不在内存中需要物理读取

        Lazy writes/sec 内存压力时成批的刷新老化缓冲区 

   当一个操作需要大量读取数据,且数据页不在缓存中 ——》 那么需要大量从磁盘读取冷数据放入缓存(Page Reads/sec 升高) ——》缓存有明显压力的时候Lazy writes/sec就会触发(Lazy writes/sec升高),大批量的将老化的数据或缓存计划等刷出缓存 ——》数据被清出缓存,那么页生命周期就会下降(Page life expectancy)

    

    Page Reads/sec

    

    Lazy writes/sec

    

    Page life expectancy

    

    高能预警:当你看到自己的计数器是这个样子的时候,你给的出结论不应该单单是,我内存有压力!

    这个例子不光为了说明三计数器是联动,而且也可以看出规律,那就是每三小时一次明显的内存压力。正如第一篇CPU文章的介绍,这种规律性的表象,作为系统的维护人员,一定要仔细想想什么操作导致的问题?不要因为一个简单的配置问题而拖慢了整个系统!

    我通过对问题时间点的语句分析发现,这个系统每三小时进行一次日志备份,正常的日志备份不会导致这样的现象,但如果在日志备份的时候加上CHECKDB呢?

    这就是所说的不要因为一个小的失误而影响整个系统!

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

系统内存不足的表象          

    下面展示一个内存压力的服务器这三个计数器的表象:

    Page Reads/sec

    

    Lazy writes/sec    

    

    Page life expectancy 页生命周期

    

     

    这几个计数器反应出的问题绝对是系统内存严重不足,计数器双高一低。那么当我们知道系统内存不足的时候应该怎么办呢?加内存么?

    不要急,下面我们说说如何让你的系统节省内存,也许做过这一轮优化,你的系统内存就够用了! 你没听错,就是-----优化!

优化-----让你的内存无压力

    你要给你的系统设置最大内存max server memory   

    

    问:我系统内存本来就不够为什么还要设置使用上限?我这服务器就给数据库用还用设置?

   答:数据库是运行在windows 上的应用,他和notepad对于操作系统来说本质上没区别,那么这就好比君(操作系统)与 臣(数据库)的关系。

    而SQL SERVER是一个很喜欢内存的应用,所以很可能吃掉大量内存导致windows系统没有足够内存使用,,那么这时候君臣关系就体现的淋漓尽致了,君(windows) 要臣(SQL SERVER)死(释放内存)臣不得不死呀...这个释放在一定程度上可不是单单让windows够用了,很可能导致SQL内存陡降,以致SQL 短时间假死(操作无响应)。所以为了你数据库的稳定性,这个最大上限一定要设置。

    内存设置推荐:

    一般我比较推荐如果内存较小操作系统预留3G-4G ,如果内存大256或512以上在数据库内存无压力时预留5%给操作系统,剩下给SQL SERVER ,如果服务器还有其他应用还要在SQL 中减掉应用所占的内存。

    如果内存比较小且数据库内存压力大,则可以通过前面讲述的Available MBytes 的判断结果适量给系统预留内存。

    

    注意:最大内存的设置单位为 MB

语句的优化,让语句消耗内存更少!

    语句优化系列请关注后续文章,这里只针对降低内存

    降低内存对语句优化主要集中在几个方面:

  1. 是否缺失索引?
  2. 消耗内存的操作是否可以消除(如排序)
  3. 降低语句复杂性,让优化器能选用最佳计划

    语句消耗内存主要体现在大量的读取,或者有排序等操作。限于篇幅这里只做简单的例子,详细的语句优化请关注后续文章。

    所谓的读,写简单理解就是在语句执行时所需要用到的数据页数,需要的越多就需要越大的内存来缓存这些数据页。如果需要的页不在内存中还需要从磁盘读取 (磁盘读取就是为什么Page Reads/sec 会高)

    

    简单的一个加索引降低逻辑读的例子~

    

    

    

    语句使用了一个整个表扫描的计划,执行了 19秒,逻辑读取143800次,预读137236 (磁盘上读取),消耗了40KB 的内存 ,并且明确提示出缺少索引!

    那么我们加上提示缺少的索引,再次执行

    

    

    加上索引的语句执行不到1秒 逻辑读降低到13次,内存消耗已经可以忽略不计。这就是索引对语句的重要性!单条语句如此,你的系统中到底有多少这样的语句呢?

    

    再来看一个写法修改的例子 :

    

    

    

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

    

    这两个例子,告诉我们也许系统中简简单单做一些调整,内存的压力就会明显降低或者变得非常充足,所以在你下了一个需要购买内存的决定前,是否针对系统的语句进行过调优?

      

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

 对于内存性能计数器的阀值简单说明

 Page life expectancy 计数器这个时间要高于多少才算正常呢?

    答:很多资料上多这个值都有误解,说是300S,300S是在十多年前的一个参考值,是基于当时的服务器内存受到4GB内存的限制的影响得到的,

  目前服务器内存动辄超过100GB的情况下,用同样的标准,显然是不够准确的,这个值的计算是跟具体的服务器内存配置有关的,一个可供参考的标准算法是 Max Buffer Pool(GB)/4*300(S)

为什么这里缺少了一个 Buffer Cache hit ratio 计数器?

很多材料上都介绍其阈值是90%,95%之类的参考值,其实都是错误的,

    其实真正观察过的人,早就会发现,从PLE和Buffer hit ratio得出根本不一致的结论。

详细说明请参见:wy123的博客

Sql Server 内存相关计数器以及内存压力诊断

Buffer cache hit ratio性能计数器真的可以作为内存瓶颈的判断指标吗?

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

  总结:内存对于数据库来说是最为重要的依赖之一,内存的问题诊断和优化对系统至关重要。

     优化语句可以让你的系统内存压力明显降低。

     语句优化所带来的效果,在很大程度上会比添加硬件更有效!

     作为一个技术人员对于系统问题的定位、分析、调优是最重要的,如果内存问题都通过加内存来解决,我们的价值何在呢?

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

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

  引用高大侠的一句话 :“拒绝SQL Server背锅,从我做起!”

为了方便阅读给出系列文章的导读链接:

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

Expert 诊断优化系列------------------内存不够用么?的更多相关文章

  1. Expert 诊断优化系列------------------冤枉磁盘了

    现在很多用户被数据库的慢的问题所困扰,又苦于花钱请一个专业的DBA成本太高.软件维护人员对数据库的了解又不是那么深入,所以导致问题迟迟不能解决,或只能暂时解决不能得到根治.开发人员解决数据问题基本又是 ...

  2. Expert 诊断优化系列------------------透过等待看系统

    上一篇我们简单的介绍了,语句优化的三板斧,大部分语句三板斧过后,就算不成为法拉利也能是个宝马了.为了方便阅读给出系列文章的导读链接: SQL SERVER全面优化-------Expert for S ...

  3. Expert 诊断优化系列------------------语句调优三板斧

    前面三篇通过CPU.内存.磁盘三巨头,讲述了如何透过现在看本质,怎样定位服务器三巨头反映出的问题.为了方便阅读给出链接: SQL SERVER全面优化-------Expert for SQL Ser ...

  4. Expert 诊断优化系列------------------给TempDB 降温

    前面文章针对CPU.内存.磁盘.语句.等待讲述了SQL SERVER的一些基本的问题诊断与调优方式.为了方便阅读给出导读文章链接方便阅读: SQL SERVER全面优化-------Expert fo ...

  5. Expert 诊断优化系列------------------锁是个大角色

    前面几篇已经陆续从服务器的几个大块讲述了SQL SERVER数据库的诊断和调优方式.加上本篇可以说已经可以完成常规的问题诊断及优化,本篇就是SQL SERVER中的锁.为了方便阅读给出系列文章的导读链 ...

  6. Expert 诊断优化系列-------------针对重点语句调索引

    上一篇我们说了索引的重要性,一个索引不仅能让一条语句起飞,也能大量减少系统对CPU.内存.磁盘的依赖.我想上一篇中的例子可以说明了.给出上一篇和目录文链接: SQL SERVER全面优化------- ...

  7. Expert 诊断优化系列------------------你的CPU高么?

    现在很多用户被数据库的慢的问题所困扰,又苦于花钱请一个专业的DBA成本太高.软件维护人员对数据库的了解又不是那么深入,所以导致问题迟迟不能解决,或只能暂时解决不能得到根治.开发人员解决数据问题基本又是 ...

  8. [Android 性能优化系列]内存之基础篇--Android怎样管理内存

    大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地 ...

  9. [Android 性能优化系列]内存之提升篇--应用应该怎样管理内存

    大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地 ...

随机推荐

  1. 纯css实现二级导航菜单效果,通过简单的鼠标事件操作页面元素样式变换实现二级导航菜单的功能,非常简单实用,

    HTML代码如下 <!-- 头部导航栏开始--><div id="nav"><dl class="sy"><dt> ...

  2. Oracle临时文件

    临时数据文件时一种特殊的文件,当内存不足时,Oracle用他来存储一些临时数据,如排序或散列操作. 自12c起,对临时表的操作所产生的undo也会放到临时表空间中,而在12c之前,这部分undo放在u ...

  3. Conditional project or library reference in Visual Studio

    Conditional project or library reference in Visual Studio In case you were wondering why you haven’t ...

  4. 多对多关系<EntityFramework6.0>

    无负载建立多对多关联的模型 原文中是Modeling a Many-to-Many Relationship with No Payload,虽然这么翻译也有点不准确,但是可以说明其目的,如下图所示, ...

  5. java中的泛型的使用与理解

    什么是泛型? 泛型是程序设计语言的一种特性.允许程序员在强类型程序设计语言中编写 体验泛型代码时定义一些可变部份,那些部份在使用前必须作出指明.各种程序设计语言和其编译器.运行环境对泛型的支持均不一样 ...

  6. Global Translator

    Global Translator插件可以把已经通过翻译服务翻译好的内容生成对应语种的“静态”页面,或者说“缓存”起来,这样在一段时间内(可设置)想访问该语种的这 个页面的访客,就可以在不调用翻译服务 ...

  7. SSH框架整合(XML)

    Struts2+Spring+Hibernate导包 Struts2导入jar包 struts2/apps/struts2-blank.war/WEB-INF/lib/*.jar 导入与spring整 ...

  8. Tsinsen A1493 城市规划(DP + CDQ分治 + NTT)

    题目 Source http://www.tsinsen.com/A1493 Description 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了. 刚才说过, 阿狸的国家有n个城市, 现在 ...

  9. Windows Commands and API

    Shortcuts ... Symbolic Links https://en.wikipedia.org/wiki/NTFS_symbolic_link Hard Links https://en. ...

  10. 【翻译svg教程 】svg 的坐标系统

    http://tutorials.jenkov.com/svg/svg-coordinate-system.html svg的坐标系统(和大多数计算机绘图的坐标系统)和数学中绘图系统有点不一样 数学/ ...