2024年4月6日发(作者:)
SQL Server允许并发操作,BLOCKING是指在某一操作没有完成之前,其他操作
必须等待,以便于保证数据的完整性。BLOCKING的解决方法要查看BLOCKING的
头是什么,为什么BLOCKING头上的语句执行的很慢。通常来讲只要我们能找到
BLOCKING头上的语句,我们总能够想出各种各种的办法,来提升性能,缓解或
解决BLOCKING的问题。
但是问题的关键是,我们不知道BLOCKING什么时候会发生。用户跟我们抱怨数
据库性能很差,等我们连上数据库去查看的时候,那时候有可能BLOCKING可能
就已经过去了。性能又变好了。或者由于问题的紧急性,我们直接重新启动服务
器以恢复运营。但是问题并没有最终解决,我们不知道下次问题会在什么时候发
生。
BLOCKING问题的后果比较严重。因为终端用户能直接体验到。他们提交一个订
单的时候,无论如何提交不上去,通常几秒之内能完成的一个订单提交,甚至要
等待十几分钟,才能提交完成。更有甚者,极严重的BLOCKING能导致SQL Server
停止工作。如下面的SQL ERRORLOG所表示, 在短短的几分钟之内,SPID数据从
158增长到694, 并马上导致SQL Server打了一个dump, 停止工作。我们很容
易推断出问题的原因是由于BLOCKING导致的,但是我们无法得知BLOCKING
HEADER是什么,我们必须要等下次问题重现时,辅之以工具,才能得知BLOCKING
HEADER在做什么事情。如果信息抓取时机不对,我们可能要等问题发生好几次,
才能抓到。这时候,客户和经理就会有抱怨了。因为我们的系统是生产系统,问
题每发生一次,都会对客户带来损失。
2011-06-01 16:22:30.98 spid1931 Alert There are 158 Active database sessions which is too high.
2011-06-01 16:23:31.16 spid3248 Alert There are 342 Active database sessions which is too high.
2011-06-01 16:24:31.06 spid3884 Alert There are 517 Active database sessions which is too high.
2011-06-01 16:25:31.08 spid3688 Alert There are 694 Active database sessions which is too high.
2011-06-01 16:26:50.93 Server Using '' version '4.0.5'
2011-06-01 16:26:50.97 Server **Dump thread - spid = 0, EC = 0x0000
2011-06-01 16:26:50.97 Server ***Stack Dump being sent to
D:
2011-06-01 16:26:50.97 Server *
*******************************************************************************
2011-06-01 16:26:50.97 Server *
2011-06-01 16:26:50.97 Server * BEGIN STACK DUMP:
2011-06-01 16:26:50.97 Server * 06/01/11 16:26:50 spid 4124
2011-06-01 16:26:50.97 Server *
2011-06-01 16:26:50.97 Server * Deadlocked Schedulers
2011-06-01 16:26:50.97 Server *
2011-06-01 16:26:50.97 Server *
*******************************************************************************
2011-06-01 16:26:50.97 Server *
-------------------------------------------------------------------------------
2011-06-01 16:26:50.97 Server * Short Stack Dump
2011-06-01 16:26:51.01 Server Stack Signature for the dump is 0x0258
BLOCKING的信息抓取有很多种方法。这里罗列了几种。并且对每种分析它的优
缺点。以便我们选择。在枚举方法之前,我们先简单演示一下BLOCKING.
我们首先创建一个测试表:
DROPTABLE [TESTTABLE]
GO
CREATETABLE [dbo].[TESTTABLE](
)
GO
[ID] [int] NULL,
[NAME] [nvarchar](50)NULL
发布评论