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

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

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

    

    首先阅读本文之前,大家都应该知道锁是影响你性能的一个重大因素,那么SQL SERVER为什么要引入锁呢?那就是要解决多个用户同时对数据库的并发操作时会带来以下数据不一致的问题。我想为了保证数据一致性,哪怕牺牲再多也是值得的!本文主要介绍怎么找到这个牺牲的点,及如何让你的牺牲降到最低!

    还记得等待篇中的那个北京三环么?

    

    等待很多时候都是在等待获取对象上的锁!当数据库中出现很多很多锁时,系统瞬间就无法提供正常服务。此时观察系统资源的使用情况,会发现CPU使用率不高,内存占用量也不高,还有很多未使用的内存,网络带宽也充足,硬盘也不繁忙,通过数据库管理工具查询的话,SQL SERVER中的数据也正常无误,但是使用系统的用户访问此数据库时却要需要等很多久很久,更多的就出现连接超时,数据库无响应。

    这就好比本来就是早高峰,前面还撞了!十一车连撞很壮观,对于数据库十一条连锁,也很给力!

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

Expert 诊断优化系列 http://www.cnblogs.com/double-K/

 

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

  锁造成的等待主要有两种:和 LCK_ 和 PAGELATCH_

  PAGELATCH_:轻量级数据库内部使用的闩锁,这里不介绍

  LCK_ : 八斤半的大锁这里就说它!

  注 : 锁相关的基础知识请自行百度学习!

  • 诊断锁常用的性能计数器

  1. Lock Requests/sec  每秒锁请求数
  2. Lock Waits/sec       每秒锁等待数
  3. Lock Wait Time (ms)   锁等待时间
  4. Average Wait Time (ms)   平均等待时间
  5. Number of Deadlocks/sec   每秒死锁数
  6. Latch Waits/sec          闩锁等待数
  7. Average Latch Wait Time (ms)   闩锁平均等待时间

  计数器不过多介绍,不会用的朋友请自行百度。直接上例子:

  这个例子中客户反映特定时间点系统特别慢严重影响业务,那么我们按常规顺序进行一次全面分析。

  

  CPU来看在10点左右和晚上6点左右出现90%以上的高峰。

  

  

  

  页生命周期和惰性写入器可以看出内存并无明显的压力

  

  以10点为例(为什么不看六点?我默默地分析过是一样的情况)磁盘队列并不高,但10点15分的时候出现磁盘高压力。那么这是一个问题导致的还是两个呢?我们接着看。

  

  事务活动数在10点的时候达到一个很高的值。

  

  用户连接数在10点也彪高,那么问题清楚了,就是10点时候是用户连接太多了压力大了导致系统慢的!别天真了这篇主题是锁,主角还没出场怎么能结束? 反复强调不要轻易下结论!

  连接数量多,还一个原因就是连接执行语句的时间长很长时间才能释放,那么其他的应用只能打开新连接,所以连接数会彪高,

  

  log刷新数量彪高这时间点在insert、delete或update?

  

  Forwarded Records/sec 彪高?update !大量update!无主键表update!

  这就看出来是update了?咋看出来的? 这里不过多说明,请参见 : SQL Server中一个隐性的IO性能杀手-Forwarded record

-----------------------------------------下面进入正题了--------------------

   我大量update系统会很慢?会跑不动?

   我们看下锁相关的计数器

   

    

   锁请求数! 这个时间点大量的锁请求产生!

    

    

    锁等待,大量锁等待

    

    

    再看等待时间,高峰点已经达到了70秒!! 要等待70秒是啥概念? 简直是高考学校门口,还是个早高峰!!

    

     天啊,还好没有死锁....

------------------------------语句及等待诊断--------------------

  我通过计数器可以发现2个主要问题:1. 十点的时候大量update更新,导致系统大面积阻塞,语句运行时间过长。2.十点15分以后有大量磁盘读操作,导致磁盘队列暴增。

  下面我们看一下语句和等待的情况:

  

  语句和等待总体反应情况很正常,长时间语句少,而且等待并不严重。那么说明,这么系统问题点就是在特定时间点(这也是用户反应的系统慢的原因,开篇就已经提过)

  

  那下面我们就深入10点,看看那时候到底怎么了!

  首先 我们先看看语句情况!

  

   上面图中我们只是展示了问题时点的一部分语句,主要可以看出如下结论:

  1. 问题时间点确实有大量的更新操作
  2. 更新操作被严重阻塞(锁)
  3. 且是一个程序循环调用的更新
  4. 语句运行时间长
  5. CPU高是因为这个时间点除了update以外还有大量的查询导致CPU高(一般情况下,系统大面积锁等待的时候CPU 资源不能有效利用,CPU会低)

  接着我们看一下等待的情况,看看到底是怎么搞得,竟然锁的这么厉害!

  

  语句总体等待来看全天都有但十点大量,并且造成系统卡死(默认30秒超时,很多都应该超时了,所以用户体验非常差!),语句的CPU和读写都不多,也说明就是相互锁的很严重!

   

    大量的语句都是被195锁住的,而195其实本身也是同样的一个update,客户的程序中有频繁的这条update,并且在10点的时候会有另一个程序的一次大批量的循环更新,这也是造成这个大面积锁阻塞的原因!

   第二个问题,磁盘10点15为什么那么高?和更新有关系?

   

  这里可以看出第二个问题10点15的时候确实有很多大逻辑读的查询,还跟新没什么关系,但和业务有无关联就不得而知了。导致系统磁盘压力变大,和主题关系不大这里不说了..

  • 关于锁的一个小误区

  select 会阻塞 update 么?

  上段简单小代码

  

create table a (a int)

insert into a
select OBJECT_ID from sys.objects where object_id between 1 and 1000

begin tran
select * from a with(holdlock)
where a = 3

--------------新开一个session 执行
update a  set a = 30
where a = 3

  

  这里的with(holdlock) 是让查询保持S锁,模拟你的查询还没结束。

  

  sp_who2 或 select session_id,status,command,blocking_session_id,wait_type from sys.dm_exec_requests where session_id = 58 查看一下

  

  

  高能预警: 查询也会阻塞更新的哦~~

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

Expert 诊断优化系列 http://www.cnblogs.com/double-K/

 

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

  总结:语句运行时间长,很可能的一个原因就是阻塞导致的,而阻塞大部分情况都是因为资源之间的所等待。

     语句调优的时候有必要对系统做一个全面的分析。(如本文所讲)

     锁的优化可以说是比较深入问题分析,减少锁的相互影响,主要也可以从语句优化入手,降低消耗缩短时间。另外也可以从业务设计方面入手,降低热点资源的争用。

     锁主要是为了维护数据一致性而不得不做的牺牲。我们只能尽一切办法降低他的影响。

     

PS:限于篇幅本文没有讲述一些基本知识,请自行学习,如隔离级别、锁矩阵兼容性等等.....

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

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

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

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

时间: 2024-10-02 07:17:49

Expert 诊断优化系列------------------锁是个大角色的相关文章

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

前面文章针对CPU.内存.磁盘.语句.等待讲述了SQL SERVER的一些基本的问题诊断与调优方式.为了方便阅读给出导读文章链接方便阅读: SQL SERVER全面优化-------Expert for SQL Server 诊断系列 这篇我们来说说TempDB,这个系统数据库如何进行优化,怎么样平衡他的使用. 首先简单介绍一下TempDB:Tempdb是SQL Server里的一个重要的系统数据库.并且每个实例中只有一个TempDB,也就是当你在一个实例下创建了100个数据库,这100个数据库

Expert 诊断优化系列------------------语句调优

前面三篇通过CPU.内存.磁盘三巨头,讲述了如何透过现在看本质,怎样定位服务器三巨头反映出的问题.为了方便阅读给出链接: Expert 诊断优化系列------------------你的CPU高么? Expert 诊断优化系列------------------内存不够用么? Expert 诊断优化系列------------------冤枉磁盘了 通过三篇文章的基本介绍,可以看出系统的语句如果不优化,可能会导致三巨头都出现异常的表现.所以本篇开始介绍系统中的重头戏--------------

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

上一篇我们简单的介绍了,语句优化的三板斧,大部分语句三板斧过后,就算不成为法拉利也能是个宝马了.为了方便阅读给出系列文章的导读链接: SQL SERVER全面优化-------Expert for SQL Server 诊断系列 本篇主要讲述几个常见的系统等待,透过这些等待,看看系统存在什么问题,怎么样解决这些问题.结合系统三巨头(CPU,内存,磁盘)综合展现系统问题和这些元素的联系. 首先我们举个例子:前文提到了,一个好的SQL语句就好比一辆时速180的好车,好的系统硬件(CPU,内存,磁盘)

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

上一篇我们说了索引的重要性,一个索引不仅能让一条语句起飞,也能大量减少系统对CPU.内存.磁盘的依赖.我想上一篇中的例子可以说明了.给出上一篇和目录文链接: SQL SERVER全面优化-------索引有多重要? SQL SERVER全面优化-------Expert for SQL Server 诊断系列 书接前文,我们知道了索引的重要,也知道了索引怎么加,那么我们应该往那些语句加?语句一条一条漫无目的的优化么?我怎么找出系统的问题语句?怎么样的一个优先级?  很多对数据库了解不是很多的人,

Expert 诊断优化系列------------------内存不够用么?

现在很多用户被数据库的慢的问题所困扰,又苦于花钱请一个专业的DBA成本太高.软件维护人员对数据库的了解又不是那么深入,所以导致问题迟迟不能解决,或只能暂时解决不能得到根治.开发人员解决数据问题基本又是搜遍百度各种方法尝试个遍,可能错过诊断问题的最佳时机又可能尝试一堆方法最后无奈放弃. 怎么样让琐事缠身的程序维护人员,用最快的方式解决数据库出现的问题?怎么让我们程序员的痛苦降低到最小...每天喝喝茶水,看看新闻平安度过一天呢?本系列重要通过Expert for sqlserver工具讲解下数据库遇

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

现在很多用户被数据库的慢的问题所困扰,又苦于花钱请一个专业的DBA成本太高.软件维护人员对数据库的了解又不是那么深入,所以导致问题迟迟不能解决,或只能暂时解决不能得到根治.开发人员解决数据问题基本又是搜遍百度各种方法尝试个遍,可能错过诊断问题的最佳时机又可能尝试一堆方法最后无奈放弃. 怎么样让琐事缠身的程序维护人员,用最快的方式解决数据库出现的问题?怎么让我们程序员的痛苦降低到最小...每天喝喝茶水,看看新闻平安度过一天呢?本系列重要通过Expert for sqlserver工具讲解下数据库遇

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

现在很多用户被数据库的慢的问题所困扰,又苦于花钱请一个专业的DBA成本太高.软件维护人员对数据库的了解又不是那么深入,所以导致问题迟迟不能解决,或只能暂时解决不能得到根治.开发人员解决数据问题基本又是搜遍百度各种方法尝试个遍,可能错过诊断问题的最佳时机又可能尝试一堆方法最后无奈放弃. 怎么样让琐事缠身的程序维护人员,用最快的方式解决数据库出现的问题?怎么让我们程序员的痛苦降低到最小...每天喝喝茶水,看看新闻平安度过一天呢?本系列重要通过Expert for sqlserver工具讲解下数据库遇

PLSQL_性能优化系列09_Oracle Partition Table大数据分区表

2014-08-22 BaoXinjian 一.摘要 1.分区表: 随着表的不断增大,对于新纪录的增加.查找.删除等(DML)的维护也更加困难.对于数据库中的超大型表,可通过把它的数据分成若干个小表,从而简化数据库的管理活动.对于每一个简化后的小表,我们称为一个单个的分区 对于分区的访问,我们不需要使用特殊的SQL查询语句或特定的DML语句,而且可以单独的操作单个分区,而不是整个表.同时可以将不同分区的数据放置到不 同的表空间,比如将不同年份的销售数据,存放在不同的表空间,即年的销售数据存放到T

Android应用性能优化系列视图篇——隐藏在资源图片中的内存杀手

图片加载性能优化永远是Android领域中一个无法绕过的话题,经过数年的发展,涌现了很多成熟的图片加载开源库,比如Fresco.Picasso.UIL等等,使得图片加载不再是一个头疼的问题,并且大幅降低了OOM发生的概率.然而,在图片加载方面我们是否可以就此放松警惕了呢? 开源图片加载库能为我们解决绝大部分有关图片的问题,然而并不是所有! 首先,图片从来源上可以分成三大类:网络图片.手机图片.APK资源图片.网络图片和手机图片都在图片加载库功能的覆盖范围内,基本上不用开发者太操心,但是APK资源