sql server 性能调优之 资源等待 LCk
一. 概述
这次介绍实例级别资源等待LCK类型锁的等待时间,关于LCK锁的介绍可参考 “sql server 锁与事务拨云见日”。下面还是使用sys.dm_os_wait_stats 来查看,并找出耗时最高的LOK锁。
select wait_type, waiting_tasks_count, wait_time_ms , max_wait_time_ms, signal_wait_time_ms from sys.dm_os_wait_stats where wait_type like 'LCK%' order by wait_time_ms desc
查出如下图所示:
1. 分析介绍
重点介绍几个耗时最高的锁含义:
LCK_M_IX: 正在等待获取意向排它锁。在增删改查中都会有涉及到意向排它锁。
LCK_M_U: 正在等待获取更新锁。 在修改删除都会有涉及到更新锁。
LCK_M_S:正在等待获取共享锁。 主要是查询,修改删除也都会有涉及到共享锁。
LCK_M_X:正在等待获取排它锁。在增删改中都会有涉及到排它锁。
LCK_M_SCH_S:正在等待获取架构共享锁。防止其它用户修改如表结构。
LCK_M_SCH_M:正在等待获取架构修改锁 如添加列或删除列 这个时候使用的架构修改锁。
下面表格是统计分析
锁类型 | 锁等待次数 | 锁等待总时间(秒) | 平均每次等待时间(毫秒) | 最大等待时间 |
LCK_M_IX | 26456 | 5846.871 | 221 | 47623 |
LCK_M_U | 34725 | 425.081 | 12 | 6311 |
LCK_M_S | 613 | 239.899 | 391 | 4938 |
LCK_M_X | 4832 | 77.878 | 16 | 4684 |
LCK_M_SCH_S | 397 | 77.832 | 196 | 6074 |
LCK_M_SCH_M | 113 | 35.783 | 316 | 2268 |
注意: wait_time_ms 时间里,该时间表包括了signal_wait_time_ms信号等待时间,也就是说wait_time_ms不仅包括了申请锁需要的等待时间,还包括了线程Runnable 的信号等待。通过这个结论也能得出max_wait_time_ms 最大等待时间不仅仅只是锁申请需要的等待时间。
2. 重现锁等待时间
-- 重置 DBCC SQLPERF ('sys.dm_os_wait_stats', CLEAR);
-- 会话1 更新SID=92525000, 未提交 begin tran update [dbo].[PUB_StockTestbak] set model='mmtest' where sid=92525000
-- 会话2 查询该ID, 由于会话1更新未提交 占用x锁,这里查询将阻塞 select * from [PUB_StockTestbak] where sid=92525000
手动取消会话2的查询,占用时间是61秒,如下图:
再来统计资源等待LCK,如下图 :
总结:可以看出资源等待LCK的统计信息还是非常正确的。所以找出性能消耗最高的锁类型,去优化是很有必要。比较有针对性的解决阻塞问题。
3. 造成等待的现象和原因
现象:
(1) 用户并发越问越多,性能越来越差。应用程序运行很慢。
(2) 客户端经常收到错误 error 1222 已超过了锁请求超时时段。
(3) 客户端经常收到错误 error 1205 死锁。
(4) 某些特定的sql 不能及时返回应用端。
原因:
(1) 用户并发访问越多,阻塞就会越来越多。
(2) 没有合理使用索引,锁申请的数量多。
(3) 共享锁没有使用nolock, 查询带来阻塞。 好处是必免脏读。
(4) 处理的数据过大。比如:一次更新上千条,且并发多。
(5) 没有选择合适的事务隔离级别,复杂的事务处理等。
4. 优化锁的等待时间
在优化锁等待优化方面,有很多切入点 像前几篇中有介绍 CPU和I/O的耗时排查和处理方案。 我们也可以自己写sql来监听锁等待的sql 语句。能够知道哪个库,哪个表,哪条语句发生了阻塞等待,是谁阻塞了它,阻塞的时间。
从上面的平均每次等待时间(毫秒),最大等待时间 作为参考可以设置一个阀值。 通过sys.sysprocesses 提供的信息来统计, 关于sys.sysprocesses使用可参考 "sql server 性能调优 从用户会话状态分析"。 通过该视图 监听一段时间内的阻塞信息。可以设置每10秒跑一次监听语句,把阻塞与被阻塞存储下来。
思想如下:
-- 例如 找出被阻塞会话ID 如时间上是2秒 以及谁阻塞了它的会话ID SELECT spid,blocked #monitorlock FROM sys.sysprocesses where blocked>0 and waittime>2000 -- 通过while或游标来一行行获取临时表的 会话ID,阻塞ID,通过exec动态执行来获取sql语句文本 进行存储 exec('DBCC INPUTBUFFER('+@spid+')') exec('DBCC INPUTBUFFER('+@blocked+')')
转载于:https://www.cnblogs.com/MrHSR/p/9319367.html
sql server 性能调优之 资源等待 LCk相关推荐
- SQL Server 性能调优(cpu)
SQL Server 性能调优(cpu) 研究cpu压力工具 perfom SQL跟踪 性能视图 cpu相关的waitevent Signal wait time SOS_SCHEDULER_YIEL ...
- SQL Server 性能调优(方法论)
SQL Server 性能调优(方法论) 目录 确定思路 wait event的基本troubleshooting 虚拟文件信息(virtual file Statistics) 性能指标 执行计划缓 ...
- SQL Server 性能调优3 之索引(Index)的维护
SQL Server 性能调优3 之索引(Index)的维护 热度1 评论 16 作者:溪溪水草 SQL Server 性能调优3 之索引(Index)的维护 前言 前一篇的文章介绍了通过建立索引来提 ...
- SQL Server性能调优之执行计划深度剖析 第二节 执行计划第一次实践
SQL Server性能调优之执行计划深度剖析 第二节 执行计划第一次实践 前言:自从上一篇文章发出之后,收到了很朋友的关注.很多朋友要求多多实践,而不是纯粹的理论.确实,从打算出这个系列开始,我就本 ...
- 读SQL Server性能调优实战——陈畅亮、吴一晴著
sqlserver 微软 安装 根据业务特点来考虑 1.分析产品业务数据的增长量 预估某些关键业务数据在一定时间内的增长量,预估数据在未来的增长数据, 2.了解产品业务操作类型.考虑业务是以查询为主还 ...
- SQL Server性能调优入门(图文版)
第一步,在业务高峰期抓取样本数据(2个小时左右).采用的工具是sqlserver自带的profiler,也叫事件探查器,如下图: 进入后,点击最左面的按钮,建立一个新的跟踪: 登录需要用DBO权限,所 ...
- SQL Server性能调优:资源管理之内存管理篇(上)
http://www.cnblogs.com/caspnet/archive/2011/02/21/1959539.html 对SQL Server来说,最重要的资源是内存.Disk和CPU,其中内存 ...
- SQL Server 性能调优(内存)
存储引擎自调整 sql server 是如何分配内存的 32bit地址空间的限制 用户模式vas分配和virtualalloc 非boffer pool 分配内存(保留内存) VAS调整 AWE 启动 ...
- SQL Server性能调优--优化建议(二)
序言 优化建议 库表的合理设计对项目后期的响应时间和吞吐量起到至关重要的地位,它直接影响到了业务所需处理的sql语句的复杂程度,为提高数据库的性能,更多的把逻辑主外键.级联删除.减少check约束.给 ...
最新文章
- 新版gitbook导出pdf
- linux禁止系统休眠,让linux系统休眠
- MySQL优化:数据量很大,分页查询很慢,有什么优化方案?
- CakePHP Pagination (分頁功能) 加入自己的參數
- STM32常见错误error: #268: declaration may not appear after executable statement
- 《数源思维》提问工具之“语法套”
- maven项目添加新dependency jar后本地可正常运行,但打包后加载不上
- jsoneditor
- paypal支付开发接口(转)
- TypeScript学习
- app中常见的测试点
- 一分钟学会看k线图_一分钟学会看k线图(12种阳线阴线图解)
- 整车电源状态 K15 KL30 KL31
- 从零开始实现放置游戏(一)——游戏设计
- 如何在Windows 7和Vista之间共享文件和打印机
- MEMS硅麦和ECM驻极体麦
- linux系统常用性能参数命令
- Curses函数说明(SCO)
- 智慧园区信息化解决方案,未来园区发展新方向
- 有线宽带终结者?华为5G CPE Pro让智能家居迈入5G时代