在 SQL Server 中查找活动连接和死锁

种地  论坛元老 | 2022-8-27 18:40:40 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1053|帖子 1053|积分 3159

在SQL Server中有几种方法可以找到活动的 SQL 连接。让我们看看一些使用 T-SQL 查询的简单快捷的方法。
SP_WHO

SP_WHO 是 SQL Server 内置的系统存储过程, 其他方法相比,SP_WHO 将具有最少的列,但是一种快速列出活动连接的方法。
以下是在 SQL Server Management Studio 中的执行示例:
  1. EXEC SP_WHO
复制代码

具体的字段解释请参阅官方文档 SP_WHO
其中比较重要的列是:

  • spid: 会话ID
  • loginname: 登录账号
  • blk: 阻塞进程的会话ID(如果存在)。否则,此列为零, 可以使用该列排查死锁
SYS.SYSPROCESSES

另一种查找活动 SQL 连接的绝妙方法是使用系统兼容性视图 SYS.SYSPROCESSES
此视图有很多列,其中包含很多信息,这些信息有助于您找出活动的 sql 连接,尤其是当您想要查找被阻塞的进程时。但是,这是向后兼容的视图,不建议使用,因为未来的版本可能会删除它
以下是在 SQL Server Management Studio 中的执行示例:
  1. SELECT * FROM SYS.SYSPROCESSES
复制代码

具体的字段解释请参阅官方文档 SYS.SYSPROCESSES
SYS.DM_EXEC_SESSIONS (建议使用)

SYS.DM_EXEC_SESSIONS 是替代旧系统表 sysprocesses 的动态管理视图之一。SYS.DM_EXEC_SESSIONS 的优点是它的列 is_user_process 。使用此列,您可以轻松过滤掉系统进程。
以下是在 SQL Server Management Studio 中的执行示例:
  1. SELECT * FROM SYS.DM_EXEC_SESSIONS where is_user_process = 1
复制代码

具体的字段解释请参阅官方文档 SYS.DM_EXEC_SESSIONS
用于查找 SQL Server 中的死锁的 T-SQL 查询

下面是我用来快速查找死锁的查询。此语句基于SYS.DM_EXEC_REQUESTS 动态管理视图。在此语句中,blocking_session_id 列为您提供了阻塞连接的 session_id,而 wait_type 列为您提供了导致 deadlock 的 等待类型。获得blocking_session_id 后,您可以使用 SYS.DM_EXEC_SESSIONS 来获取有关会话或连接的更多详细信息。
  1. SELECT
  2.     session_id,
  3.     start_time,
  4.     [status],
  5.     command,
  6.     blocking_session_id,
  7.     wait_type,
  8.     wait_time,
  9.     open_transaction_count,
  10.     transaction_id,
  11.     total_elapsed_time,
  12.     Definition = CAST(text AS VARCHAR(MAX))
  13. FROM
  14.     SYS.DM_EXEC_REQUESTS
  15.     CROSS APPLY sys.dm_exec_sql_text(sql_handle)
  16. WHERE blocking_session_id != 0
复制代码

上图我们得到了正在发生阻塞的会话信息和所执行的SQL语句(Definition)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

种地

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表