我有一个仓库服务器,它全天候从旧系统获取数据/同步,我注意到我的一些报告/SQL作业的性能不确定,并且大多数时候我从DBA团队那里听到我的查询正在阻止其他同步过程。
从DBA团队那里我知道了一个命令,即EXEC SP_WHO2,通过它我可以通过查看BlkBy列来识别导致阻塞的查询的spid。
请建议我如何避免阻塞以及检查SQL Server中阻塞的其他方法。
我有一个仓库服务器,它全天候从旧系统获取数据/同步,我注意到我的一些报告/SQL作业的性能不确定,并且大多数时候我从DBA团队那里听到我的查询正在阻止其他同步过程。
从DBA团队那里我知道了一个命令,即EXEC SP_WHO2,通过它我可以通过查看BlkBy列来识别导致阻塞的查询的spid。
请建议我如何避免阻塞以及检查SQL Server中阻塞的其他方法。
除了 Sp_Who2 外,你还可以使用以下查询来识别 SQL 中的阻塞。
SELECT
db.name DBName,
tl.request_session_id,
wt.blocking_session_id,
OBJECT_NAME(p.OBJECT_ID) BlockedObjectName,
tl.resource_type,
h1.TEXT AS RequestingText,
h2.TEXT AS BlockingTest,
tl.request_mode
FROM sys.dm_tran_locks AS tl
INNER JOIN sys.databases db ON db.database_id = tl.resource_database_id
INNER JOIN sys.dm_os_waiting_tasks AS wt ON tl.lock_owner_address = wt.resource_address
INNER JOIN sys.partitions AS p ON p.hobt_id = tl.resource_associated_entity_id
INNER JOIN sys.dm_exec_connections ec1 ON ec1.session_id = tl.request_session_id
INNER JOIN sys.dm_exec_connections ec2 ON ec2.session_id = wt.blocking_session_id
CROSS APPLY sys.dm_exec_sql_text(ec1.most_recent_sql_handle) AS h1
CROSS APPLY sys.dm_exec_sql_text(ec2.most_recent_sql_handle) AS h2
GO
也可以使用以下命令查看特定SPID的详细信息。
DBCC INPUTBUFFER(56) — Will give you the Event Info.
KILL 56 -- Will kill the session of this id.
这篇是一份非常全面的指南。然而,以下是一些基本准则:
SELECT ... INTO #temp
模式,相反先创建一个表,然后使用INSERT INTO #Temp SELECT...
WITH (NOLOCK)
WHERE
子句中使用sargable谓词READ_COMMITTED_SNAPSHOT
隔离级别的可能性