sql server查询语句阻塞优化性能
作者:花阴偷移 发布时间:2024-01-25 00:44:52
在生产环境下,有时公司客服反映网页半天打不到,除了在浏览器按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负荷过重没有及时处理用户的并发请求
来源:https://www.cnblogs.com/MrHSR/p/9039719.html


猜你喜欢
- 前序1、蓝图在一个Flask 应用项目中,如果业务视图过多,可否将以某种方式划分出的业务单元单独维护,将每个单元用到的视图、静态文件、模板文
- 主要来介绍下Inner Join , Full Out Join , Cross Join , Left Join , Right Join
- 本文实例讲述了Python实现拼接多张图片的方法。分享给大家供大家参考。具体分析如下: 这里所述计划实现如下操作: ①
- 一、前言 需求是获取某个时间范围内每小时数据和上小时数据的差值以及比率
- Python字典中的键是唯一的,但不同的键可以对应同样的值,比如说uid,可以是1001。id同样可以是1001。这样的话通过值来获取指定的
- 在教材实例编写雷达图时出现ValueError,具体如下:ValueError: The number of FixedLocator lo
- 前言本文介绍如何使用Python制作一个简单的猜数字游戏。游戏规则玩家将猜测一个数字。如果猜测是正确的,玩家赢。如果不正确,程序会提示玩家所
- 一、使用css缩写使用缩写可以帮助减少你CSS文件的大小,更加容易阅读。css缩写的主要规则请参看《常用css缩写语法总结》,这里就不展开描
- 还是分析一下大体的流程:首先还是Chrome浏览器抓包分析元素,这是网址:https://www.douyu.com/directory/a
- 前言最近在工作中遇到一个问题,在创建数据库后连接数据库的时候居然报错了,错误代码是Access denied for user 'r
- python 调用系统ffmpeg进行视频截图,并进行图片http发送ffmpeg ,视频、图片的各种处理。 最近在做视频、图片
- 一 创建mappingPUT test{ "mappings": { "
- 前言 常用地图底图的绘制一般由Basemap或者cartopy模块完成,由于Basemap库是基于python2开发的一个模块,目前已经不开
- 本文实例讲述了Python贪心算法。分享给大家供大家参考,具体如下:1. 找零钱问题:假设只有 1 分、 2 分、五分、 1 角、二角、 五
- 1000块钱做个百度?能提出这种要求的客户实乃乙方克星、民族之光、科创永动机、西虹市一大杰出青年,诺奖永远得不到的人才。但作为一个硬核的程序
- 一、Beautiful Soup的安装Beautiful Soup是Python的一个HTML或XML的解析库,使用它可以很方便地从网页中提
- 一、环境准备python3.6.7Pycharm二、创建项目我这里是在Django项目中新建了个APP,目录结构如下图所示:那么怎么在已有的
- 在各类的前端开发工具里,在功能上虽然Editplus显得有些“单薄”,但是仍然是很多我辈做开发的人们离不开的工具,因为他小巧,语言高亮,支持
- 文件的一般操作步骤打开文件或创建新文件:使用相应的编程语言和对应的库或模块打开一个已经存在的文件或者创建新文件。读取文件内容或向文件中写入内
- Django 中的时区在现实环境中,存在有多个时区。用户之间很有可能存在于不同的时区,并且许多国家都拥有自己的一套夏令时系统。所以如果网站面