sql server查询语句阻塞优化性能

 更新时间:2022年04月09日 16:27:02   作者:花阴偷移  
这篇文章介绍了sql server查询语句阻塞优化性能的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

 在生产环境下,有时公司客服反映网页半天打不到,除了在浏览器按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 Duplicate entry for key ‘PRIMARY‘主键重复报错解决

    SQL Duplicate entry for key ‘PRIMAR

    解决SQL主键重复报错的几种方法包括使用INSERT IGNORE、REPLACE INTO、ON DUPLICATE KEY UPDATE等,本文就来介绍一下问题解决,感兴趣的可以了解一下
    2024-11-11
  • sql语句将数据库一条数据通过分隔符切割成多列方法实例

    sql语句将数据库一条数据通过分隔符切割成多列方法实例

    最近工作中遇到数据表中有一列数据,然后需要将该列数据分成三列,下面这篇文章主要给大家介绍了关于sql语句将数据库一条数据通过分隔符切割成多列的相关资料,需要的朋友可以参考下
    2023-03-03
  • Sql server中内部函数fn_PhysLocFormatter存在解析错误详解

    Sql server中内部函数fn_PhysLocFormatter存在解析错误详解

    这篇文章主要给大家介绍了关于Sql server中内部函数fn_PhysLocFormatter存在解析错误的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-09-09
  • MSSQL 监控数据/日志文件增长实现方法

    MSSQL 监控数据/日志文件增长实现方法

    今天就想实现这么一个功能,每天(频率可以调整)去收集一下数据文件的信息,放到一个表里面,这样方便我们分析数据文件的增长演变例程,甚至你可以将数据文件的增长幅度和业务变化关联起来分析
    2013-08-08
  • SQL中NVL()函数的用法

    SQL中NVL()函数的用法

    SQL中的NVL()函数是一个空值转换函数,本文主要介绍了SQL中NVL()函数的用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-04-04
  • 几个扩展存储过程使用方法

    几个扩展存储过程使用方法

    sqlserver里面有一些危险的扩展存储过程,可以操作注册表,所以很多情况下,下面的存储过程为了服务器安全都会将这些存储过程删除。不过防御与安全同等重要。下面是具体的注册的操作方法。
    2010-07-07
  • 文本、Excel、Access数据导入SQL Server2000的方法

    文本、Excel、Access数据导入SQL Server2000的方法

    昨天参加一个项目的维护,因为各种原因,数据在不同服务器上不一致,所以需要重新将数据库清空一次,并将整理后的数据重新导入。需导入的数据源为文本文件,记录以行存储,“,”逗号分割各字段,每个字段值用“”双引号封闭。
    2008-10-10
  • SQL Server使用T-SQL进阶之公用表表达式(CTE)

    SQL Server使用T-SQL进阶之公用表表达式(CTE)

    这篇文章介绍了SQL Server中T-SQL的公用表表达式(CTE),文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • SQL Server 2008 R2完美卸载教程(亲测有用)

    SQL Server 2008 R2完美卸载教程(亲测有用)

    SQL Server 2008 R2是一款非常强大的数据库管理系统,但在某些情况下可能需要卸载它,下面这篇文章主要给大家介绍了关于SQL Server 2008 R2完美卸载的相关资料,需要的朋友可以参考下
    2023-11-11
  • 有关sqlserver帐号被禁用的处理方法

    有关sqlserver帐号被禁用的处理方法

    这篇文章主要介绍了有关sqlserver帐号被禁用处理方法,需要的朋友可以参考下
    2017-12-12

最新评论