1. 前言
在进行数据库开发和维护时,我们经常需要查看哪些表正在被锁定。这对于定位问题和优化数据库非常重要。在 SQL Server 管理中,查看锁定表非常简单,但在这篇文章中,我们将介绍如何通过一步突破来查看受锁定的表格。
2. 查看锁表
2.1 使用 SQL Server 管理工具
最简单的方法是使用 SQL Server 管理工具,如 SQL Server Management Studio。以下是步骤:
连接你的 SQL Server 数据库。
在对象资源管理器中,展开数据库,展开表,右键单击要查看的表格。
单击“报告”>“标准报告”>“锁定”。
这将提供与受锁定的表有关的信息。然而,这种方法对于大型数据库不一定适用。因此,我们需要一种更智能的方法。
2.2 使用系统视图
SQL Server 中有许多系统视图可以提供有关锁定的信息。以下是常用的几种系统视图和示例:
2.2.1 sys.dm_tran_locks
此视图显示当前被锁定的数据库资源(如表、行或索引)。
SELECT
object_name(p.object_id) AS [ObjectName],
resource_type AS [LockType],
resource_database_id AS [DatabaseID],
resource_description AS [ResourceDescription],
resource_associated_entity_id AS [AssociatedEntityID],
request_mode AS [Mode],
request_session_id AS [SessionID],
request_owner_type AS [RequestOwnerType],
request_status AS [RequestStatus]
FROM sys.dm_tran_locks
LEFT JOIN sys.partitions p ON
p.hobt_id = resource_associated_entity_id
2.2.2 sys.dm_exec_requests
此视图显示 SQL Server 当前正在进行的操作。可以使用它来查看查询以及它们所持有的锁定。
SELECT
R.session_id,
R.command,
R.cpu_time,
R.total_elapsed_time,
S.host_name,
S.program_name,
S.login_name,
S.status,
DB_NAME(R.database_id) AS [Database],
L.resource_type,
L.resource_description,
L.request_mode,
L.request_status
FROM sys.dm_exec_requests AS R
JOIN sys.dm_tran_locks AS L ON
L.request_session_id = R.session_id
JOIN sys.dm_exec_sessions AS S ON
S.session_id = R.session_id
3. 一步突破:使用 sp_who2
sp_who2 是存储过程,可以轻松地查看有关当前正在运行的 SQL Server 进程的信息,包括会话 ID、会话状态、登录名、CPU 时间、I/O 等待时间和锁定信息。
以下是使用 sp_who2 查看正在锁定表的示例:
EXEC sp_who2
GO
此存储过程将返回所有当前会话的信息。使用 Ctrl+F 或输入表名称,可以查找您想要找到的表。在锁定列中,您将看到该表锁定的请求模式。
4. 总结
查看受锁定的表格是 SQL Server 数据库优化的关键一步。本文介绍了如何使用 SQL Server 管理工具、系统视图和存储过程来查看受锁定的表格。使用这些方法,您可以快速定位问题,并进行适当的优化。