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 相关文章推荐
SQLServer 日期函数大全(小结)
Apr 08 SQL Server
SQL Server作业失败:无法确定所有者是否有服务器访问权限的解决方法
Jun 30 SQL Server
SQL中的三种去重方法小结
Nov 01 SQL Server
通过T-SQL语句创建游标与实现数据库加解密功能
Mar 16 SQL Server
SQL Server的存储过程与触发器以及系统函数和自定义函数
Apr 10 SQL Server
MSSQL基本语法操作
Apr 11 SQL Server
SQLServer权限之只开启创建表权限
Apr 12 SQL Server
SQL Server #{}可以防止SQL注入
May 11 SQL Server
SQL Server中使用表变量和临时表
May 20 SQL Server
SQL Server删除表中的重复数据
May 25 SQL Server
SQL Server中的逻辑函数介绍
May 25 SQL Server
详解SQL报错盲注
Jul 23 SQL Server
sql server偶发出现死锁的解决方法
SQL Server的存储过程与触发器以及系统函数和自定义函数
Apr 10 #SQL Server
SQL Server表分区降低运维和维护成本
SQL Server使用导出向导功能
SQL Server内存机制浅探
sqlserver连接错误之SQL评估期已过的问题解决
SQL Server远程连接的设置步骤(图文)
You might like
PHP获取真实客户端的真实IP
2017/03/07 PHP
jQuery查询数据返回object和字符串影响原因是什么
2013/08/09 Javascript
JS通过相同的name进行表格求和代码
2013/08/18 Javascript
Javascript倒计时页面跳转实例小结
2013/09/11 Javascript
当滚动条滚动到页面底部自动加载增加内容的js代码
2014/05/13 Javascript
JavaScript使用pop方法移除数组最后一个元素用法实例
2015/04/06 Javascript
JavaScript实现基于十进制的四舍五入实例
2015/07/17 Javascript
基于Jquery实现仿百度百科右侧导航代码附源码下载
2015/11/27 Javascript
jQuery移动web开发中的页面初始化与加载事件
2015/12/03 Javascript
详解JavaScript 中的 replace 方法
2016/01/01 Javascript
JavaScript地理位置信息API
2016/06/11 Javascript
jQuery实现select下拉框获取当前选中文本、值、索引
2017/05/08 jQuery
gulp构建小程序的方法步骤
2019/05/31 Javascript
js图片无缝滚动插件使用详解
2020/05/26 Javascript
layerui代码控制tab选项卡,添加,关闭的实例
2019/09/04 Javascript
[43:58]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第一场 1月8日
2021/03/11 DOTA
[07:01]DOTA2-DPC中国联赛正赛 Aster vs Magma 3月5日 赛后选手采访
2021/03/11 DOTA
python统计日志ip访问数的方法
2015/07/06 Python
通过数据库向Django模型添加字段的示例
2015/07/21 Python
Python中集合的内建函数和内建方法学习教程
2015/08/19 Python
python中pygame针对游戏窗口的显示方法实例分析(附源码)
2015/11/11 Python
解决python 文本过滤和清理问题
2019/08/28 Python
python 下 CMake 安装配置 OPENCV 4.1.1的方法
2019/09/30 Python
Python实现FLV视频拼接功能
2020/01/21 Python
解决pycharm同一目录下无法import其他文件
2020/02/12 Python
Pycharm内置终端及远程SSH工具的使用教程图文详解
2020/03/19 Python
Jupyter打开图形界面并画出正弦函数图像实例
2020/04/24 Python
Python基于pandas绘制散点图矩阵代码实例
2020/06/04 Python
HTML5的标签的代码的简单介绍 HTML5标签的简介
2012/05/28 HTML / CSS
一个C/C++编程面试题
2013/11/10 面试题
什么是三层交换,说说和路由的区别在那里
2014/09/01 面试题
《金孔雀轻轻跳》教学反思
2014/04/20 职场文书
恰同学少年观后感
2015/06/08 职场文书
海底两万里读书笔记
2015/06/26 职场文书
angular异步验证器防抖实例详解
2022/03/31 Javascript
Golang流模式之grpc的四种数据流
2022/04/13 Golang