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

标签:sql,server,查询,语句,阻塞,优化,性能
0
投稿

猜你喜欢

  • 关于SSD目标检测模型的人脸口罩识别

    2023-06-20 05:20:56
  • MySQL数据库优化经验详谈

    2009-12-15 10:34:00
  • 一篇文章带你了解python标准库--sys模块

    2022-04-25 10:21:37
  • 几个javascript显示加载进度条代码

    2008-01-19 10:52:00
  • Python小游戏之300行代码实现俄罗斯方块

    2023-10-09 17:35:33
  • Python字符编码与函数的基本使用方法

    2023-11-29 17:01:30
  • python字符串常用方法

    2023-07-12 19:01:50
  • js实现微信聊天效果

    2024-04-16 09:14:33
  • python标准库之time模块的语法与简单使用

    2023-06-11 17:42:23
  • ASP使用缓存方法及缓存类详解

    2008-02-15 08:36:00
  • 用SQL语句添加删除修改字段、一些表与字段的基本操作、数据库备份等

    2024-01-26 16:53:22
  • Sql语句优化注意

    2009-10-31 13:15:00
  • python训练数据时打乱训练数据与标签的两种方法小结

    2021-11-17 11:15:12
  • Python2手动安装更新pip过程实例解析

    2021-06-29 17:01:50
  • Python3.5 Pandas模块缺失值处理和层次索引实例详解

    2021-05-20 00:35:50
  • 某大型网络公司应聘时的笔试题目附答案

    2023-11-15 02:01:21
  • 基于python3监控服务器状态进行邮件报警

    2022-05-05 05:25:39
  • 利用Python校准本地时间的方法教程

    2021-06-24 06:51:41
  • python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例

    2023-08-11 19:10:44
  • echarts学习之如何给饼图中间添加文字

    2024-05-03 11:10:30
  • asp之家 网络编程 m.aspxhome.com