nicdark_icon_close_navigation

sql server 性能调优 资源等待之 LCk_亚搏娱乐app下载

注意:wait_time_ms

时间里,该时间表包括了signal_wait_time_ms信号等待时间,也就是说wait_time_ms不仅包括了申请锁需要的等待时间,还包括了线程Runnable

的信号等待。

通过这个结论也能得出max_wait_time_ms

最大等待时间不仅仅只是锁申请需要的等待时间。

2。

重现锁等待时间

–重置

DBCCSQLPERF(‘sys。

dm_os_wait_stats’,CLEAR);

–会话1更新SID=92525000,未提交

begintran

update[dbo]。

[PUB_StockTestbak]setmodel=’mmtest’wheresid=92525000

–会话2查询该ID,由于会话1更新未提交占用x锁,这里查询将阻塞

select*from[PUB_StockTestbak]wheresid=92525000



手动取消会话2的查询,占用时间是61秒,如下图:

再来统计资源等待LCK,如下图:

总结:可以看出资源等待LCK的统计信息还是非常正确的。

所以找出性能消耗最高的锁类型,去优化是很有必要。

比较有针对性的解决阻塞问题。

3。

造成等待的现象和原因

现象:

(1)?

用户并发越问越多,性能越来越差。

应用程序运行很慢。

(2)?

客户端经常收到错误error1222已超过了锁请求超时时段。

(3)?

客户端经常收到错误error1205死锁。

(4)?

某些特定的sql不能及时返回应用端。

原因:

(1)用户并发访问越多,阻塞就会越来越多。

(2)?

没有合理使用索引,锁申请的数量多。

(3)?

共享锁没有使用nolock,查询带来阻塞。

好处是必免脏读。

(4)处理的数据过大。

比如:一次更新上千条,且并发多。

(5)没有选择合适的事务隔离级别,复杂的事务处理等。

4?

优化锁的等待时间

在优化锁等待优化方面,有很多切入点像前几篇中有介绍

CPU和I/O的耗时排查和处理方案。

我们也可以自己写sql来监听锁等待的sql

语句。

能够知道哪个库,哪个表,哪条语句发生了阻塞等待,是谁阻塞了它,阻塞的时间。

从上面的平均每次等待时间(毫秒),最大等待时间

作为参考可以设置一个阀值。

通过sys。

sysprocesses提供的信息来统计,

关于sys。

sysprocesses使用可参考sqlserver性能调优

从用户会话状态分析。

通过该视图

监听一段时间内的阻塞信息。

可以设置每10秒跑一次监听语句,把阻塞与被阻塞存储下来。



思想如下:

–例如找出被阻塞会话ID如时间上是2秒以及谁阻塞了它的会话ID

SELECTspid,blocked#monitorlockFROMsys。

sysprocesses

whereblocked0andwaittime2000

–通过while或游标来一行行获取临时表的会话ID,阻塞ID,通过exec动态执行来获取sql语句文本进行存储

exec(‘DBCCINPUTBUFFER(‘+@spid+’)’)

exec(‘DBCCINPUTBUFFER(‘+@blocked+’)’)

在今天的文章里,我想谈下在线索引重建操作(?

OnlineIndexRebuild

operations),它们在SQLServer

2014里有怎样的提升。

我们都知道,自SQLServer

2005开始引入了在线索引重建操作。

但这些在线操作并非真正的在线操作,因为在操作开始时,SQL

Server需要获得共享表锁(SharedTableLock

(S)?

),在操作结束时需要在对应表上获得架构修改锁(SchemaModification

Lock(Sch-M)?

)。

因此这些操作是真正的在线操作,只是营销技巧(marketing

trick)。

但是,亲,“在线”肯定比“部分在线”好听多了。

尽管如此,SQLServer

2014还是在在线索引重建的开始和结束发生的阻塞做了一些改进。

因此,在你执行在线索引重建时,你可以定义所谓的锁优先级(LockPriority)。

来看看下面的代码,你会看到起作用的新语法?

1ALTERINDEXidx_Col1ONFooREBUILD

2WITH

3(

4ONLINE=ON

5(

6WAIT_AT_LOW_PRIORITY

7(

8MAX_DURATION=1,

9ABORT_AFTER_WAIT=SELF

10)

11)

12)

13GO

当阻塞情况发生时,你可以用WAIT_AT_LOW_PRIORITY关键字定义如何处理。

使用第1个属性MAX_DURATION指定你想要等待的时间——这里是分钟,不是秒!

用ABORT_AFTER_WAIT属性你指定哪个会话需要被SQL

Server回滚。

SELF意味着那个ALTERINDEX

REBUILD语句会回滚,当你指定BLOCKERS时,阻塞的会话会回滚。

当然,当没有阻塞发生时,在线索引重建操作会立即执行。

因此这里你只能配置当阻塞情况发生时要怎么处理。

好了,我们来实操下。

我们新建一个数据库,一个简单的表和一个聚集索引?

1–Createsanewdatabase

2CREATEDATABASETest

3GO

5–Usethedatabase

6USETest

7GO

9–Createasimpletable

10CREATETABLEFoo

11(

12Col1INTIDENTITY(1,1)NOTNULL,

13Col2INTNOTNULL,

14Col3INTNOTNULL

15)

16GO

17

18–CreateauniqueClusteredIndexonthetable

19CREATEUNIQUECLUSTEREDINDEXidx_Col1ONFoo(Col1)

20GO

21

22–Insertafewtestrecords

23INSERTINTOFooVALUES(1,1),(2,2),(3,3)

24GO



为了触发阻塞,我在不同的会话开始一个新的事务,但不提交:

1BEGINTRANSACTION

3UPDATEFooSETCol2=2

4WHERECol1=1

这意味着我们在需要修改的记录上获得排它锁(ExclusiveLock

(X)),在对应的页上获得意向排它锁(Intent-ExclusiveLock

(IX)),在表本身获得意向排它锁(Intent-ExclusiveLock

(IX))。

我们刚刚在SQLServer里创建了典型的锁定层次(locking

hierarchy):表=页=记录。

在表级别的意向排它锁(IX

Lock)和在线索引重建操作需要的共享锁(Shared

Lock)是不兼容的——典型的锁/阻塞情形发生了。

当你现在执行在线索引重建操作时,会发生阻塞:

1ALTERINDEXidx_Col1ONFooREBUILD

2WITH

3(

4ONLINE=ON

5)

6GO

当你查看DMV?

sys。

dm_tran_locks时,你会看到那个需要共享锁(Shared

Lock(S))的会话需要等待。

这个会话会永远等待。

我刚才就说过:“部分在线”……

1SELECT*FROMsys。

dm_tran_locks

当我们执行带有锁优先级(Lock


Categories :

近期评论

    分类目录

    狗万投注官方网站_狗万网站_狗万送的足球