SQL Server数据库查询出现阻塞之性能调优


Posted in SQL Server onApril 10, 2022

 在生产环境下,有时公司客服反映网页半天打不到,除了在浏览器按F12的Network响应来排查,确定web服务器无故障后。就需要检查数据库是否有出现阻塞

当时数据库的生产环境中主表数据量超过2000w,子表数据量超过1亿,且更新和新增频繁。再加上做了同步镜像,很消耗资源。

这时就要新建一个会话,大概需要了解以下几点:

  • 1.当前活动会话量有多少?
  • 2.会话运行时间?
  • 3.会话之间有没有阻塞?
  • 4.阻塞时间 ?

查询阻塞的方法有很多。有sql 2000 的sp_lock, 有sql 2005及以上的dmv

一. 阻塞查询 sp_lock

执行 exec sp_lock  下面列下关键字段

spid 是指进程ID,这个过滤掉了系统进程,只展示了用户进程spid>50。

dbid 指当前实例下的哪个数据库 , 使用DB_NAME() 函数来标识数据库

type 请求锁住的模式

mode 锁的请求状态

  • GRANT:已获取锁。
  • CNVRT:锁正在从另一种模式进行转换,但是转换被另一个持有锁(模式相冲突)的进程阻塞。
  • WAIT:锁被另一个持有锁(模式相冲突)的进程阻塞。

总结:当mode 不为GRANT状态时, 需要了解当前锁的模式,以及通过进程ID查找当前sql 语句 

例如当前进程ID是416,且mode状态为WAIT 时,查看方式 DBCC INPUTBUFFER(416)

用sp_lock查询显示的信息量很少,也很难看出谁被谁阻塞。所以当数据库版本为2005及以上时不建议使用。

 二.阻塞查询  dm_tran_locks 

SELECT 
t1.resource_type,
t1.resource_database_id,
t1.resource_associated_entity_id,
t1.request_mode,
t1.request_session_id,
t2.blocking_session_id
FROM sys.dm_tran_locks as t1
INNER JOIN sys.dm_os_waiting_tasks as t2
ON t1.lock_owner_address = t2.resource_address;

上面查询只显示有阻塞的会话, 关注blocking_session_id 也就是被阻塞的会话ID,同样使用DBCC INPUTBUFFER来查询sql语句

三.阻塞查询 sys.sysprocesses

SELECT 
 spid,
 kpid,
 blocked,
 waittime AS 'waitms', 
 lastwaittype, 
 DB_NAME(dbid)AS DB,  
 waitresource, 
 open_tran,
 hostname,[program_name],
 hostprocess,loginame,
 [status]
 FROM sys.sysprocesses WITH(NOLOCK) 
 WHERE    kpid>0  AND  [status]<>'sleeping'  AND spid>50
 AND spid<>@@SPID

sys.sysprocesses  能显示会话进程有多少, 等待时间, open_tran有多少事务, 阻塞会话是多少. 整体内容更为详细。
关键字段说明:

  • spid 会话ID(进程ID),SQL内部对一个连接的编号,一般来讲小于50
  • kipid 线程ID
  • blocked: 阻塞的进程ID, 值大于0表示阻塞, 值为本身进程ID表示io操作
  • waittime:当前等待时间(以毫秒为单位)。
  • open_tran: 进程的打开事务数
  • hostname:建立连接的客户端工作站的名称
  • program_name 应用程序的名称。
  • hostprocess 工作站进程 ID 号。
  • loginame 登录名。
    • [status]
    • running = 会话正在运行一个或多个批
    • background = 会话正在运行一个后台任务,例如死锁检测
    • rollback = 会话具有正在处理的事务回滚
    • pending = 会话正在等待工作线程变为可用
    • runnable = 会话中的任务在等待,由scheduler来运行的可执行队列中。(重要)
    • spinloop = 会话中的任务正在等待调节锁变为可用。
    • suspended = 会话正在等待事件(如 I/O)完成。(重要)
    • sleeping = 连接空闲
    • wait resource 格式为 fileid:pagenumber:rid 如(5:1:8235440)
    • kpid=0, waittime=0 空闲连接
    • kpid>0, waittime=0 运行状态
    • kpid>0, waittime>0 需要等待某个资源,才能继续执行,一般会是suspended(等待io)
    • kpid=0, waittime=0 但它还是阻塞的源头,查看open_tran>0 事务没有及时提交。

如果blocked>0,但waittime时间很短,说明阻塞时间不长,不严重
如果status 上有好几个runnable状态任务,需要认真对待。 cpu负荷过重没有及时处理用户的并发请求

到此这篇关于sql server查询语句阻塞优化性能的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

SQL Server 相关文章推荐
SQL SERVER中常用日期函数的具体使用
Apr 08 SQL Server
SQLServer2019 数据库环境搭建与使用的实现
Apr 08 SQL Server
sql查询结果列拼接成逗号分隔的字符串方法
May 25 SQL Server
利用 SQL Server 过滤索引提高查询语句的性能分析
Jul 15 SQL Server
SQL写法--行行比较
Aug 23 SQL Server
sql server删除前1000行数据的方法实例
Aug 30 SQL Server
SQL CASE 表达式的具体使用
Mar 21 SQL Server
SQL Server表分区降低运维和维护成本
Apr 08 SQL Server
SQL Server #{}可以防止SQL注入
May 11 SQL Server
SQL Server使用T-SQL语句批处理
May 20 SQL Server
sql server偶发出现死锁的解决方法
SQL Server的存储过程与触发器以及系统函数和自定义函数
Apr 10 #SQL Server
SQL Server表分区降低运维和维护成本
SQL Server使用导出向导功能
SQL Server内存机制浅探
sqlserver连接错误之SQL评估期已过的问题解决
SQL Server远程连接的设置步骤(图文)
You might like
php目录操作函数之获取目录与文件的类型
2010/12/29 PHP
php操作SVN版本服务器类代码
2011/11/27 PHP
PHP编译configure时常见错误的总结
2017/08/17 PHP
javascript css在IE和Firefox中区别分析
2009/02/18 Javascript
Extjs Ext.MessageBox.confirm 确认对话框详解
2010/04/02 Javascript
JS 如果改变span标签的是否隐藏属性
2011/10/06 Javascript
JavaScript中统计Textarea字数并提示还能输入的字符
2014/06/10 Javascript
javascript格式化日期时间方法汇总
2015/06/19 Javascript
常见JS验证脚本汇总
2015/12/01 Javascript
AngularJS入门教程之ng-checked 指令详解
2016/08/01 Javascript
js 判断各种数据类型的简单方法(推荐)
2016/08/29 Javascript
微信小程序 教程之WXML
2016/10/18 Javascript
使用Angular缓存父页面数据的方法
2017/01/03 Javascript
BootStrap表单时间选择器详解
2017/05/09 Javascript
JavaScript无操作后屏保功能的实现方法
2017/07/04 Javascript
vue之浏览器存储方法封装实例
2018/03/15 Javascript
sharp.js安装过程中遇到的问题总结
2020/04/02 Javascript
不依任何赖第三方,单纯用vue实现Tree 树形控件的案例
2020/09/21 Javascript
如何搭建一个完整的Vue3.0+ts的项目步骤
2020/10/18 Javascript
Python基于checksum计算文件是否相同的方法
2015/07/09 Python
微信跳一跳辅助python代码实现
2018/01/05 Python
解决python删除文件的权限错误问题
2018/04/24 Python
python实现括号匹配的思路详解
2018/08/23 Python
基于wxPython的GUI实现输入对话框(1)
2019/02/27 Python
python实现矩阵打印
2019/03/02 Python
python使用selenium实现批量文件下载
2019/03/11 Python
教你一步步利用python实现贪吃蛇游戏
2019/06/27 Python
JBL英国官网:JBL UK
2018/07/04 全球购物
微软中国官方旗舰店:销售Surface、Xbox One、笔记本电脑、Office
2018/07/23 全球购物
转让协议书范本
2014/04/15 职场文书
质监局领导班子对照检查材料思想汇报
2014/09/27 职场文书
毕业生班级鉴定评语
2015/01/04 职场文书
看上去很美观后感
2015/06/10 职场文书
MySQL数据库压缩版本安装与配置详细教程
2021/05/21 MySQL
python调试工具Birdseye的使用教程
2021/05/25 Python
win10截图快捷键win+shift+s没有反应无法截图怎么解决?
2022/08/14 数码科技