我正在运行一个包含大量语句的SQL事务。
该事务导致其他进程偶尔发生死锁,因此我从事务中删除了一些并不重要的事情。这些现在在交易之前单独完成。
我希望能够比较我在更改之前和之后发生的锁定,以便我可以确信更改会有所作为。
我预计之前会发生更多锁定,因为交易中有更多内容。
我可以使用任何工具吗?我可以非常轻松地获得这两种情况的SQL配置文件。
我知道像sp_who,sp_who2这样的东西,但我为这些事情而努力的事情是,这是特定时刻的快照。我想从头到尾全面了解。
答案 0 :(得分:1)
您可以使用SQL Server Profiler。设置包含Lock:Acquired和Lock:Released事件的探查器跟踪。运行“之前”查询。运行“之后”查询。比较和对比所采取的锁(和锁的类型)。对于上下文,您可能仍希望同时包含一些语句或批处理事件,以查看导致每个锁定的语句。
答案 1 :(得分:0)
您可以在构建过程中使用: - sp_who2
sp_who2还接受SPID的可选参数。如果传递了spid,则sp_who2的结果仅显示正在执行的SPID的一行或多行。
有关详细信息,请查看:master.dbo.sysprocesses表
SELECT * FROM master.dbo.sysprocesses where spid=@1
下面的代码显示了当前命令的读写,以及整个SPID的读写次数。它还显示正在使用的协议(TCP,NamedPipes或共享内存)。
CREATE PROCEDURE sp_who3
(
@SessionID int = NULL
)
AS
BEGIN
SELECT
SPID = er.session_id
,Status = ses.status
,[Login] = ses.login_name
,Host = ses.host_name
,BlkBy = er.blocking_session_id
,DBName = DB_Name(er.database_id)
,CommandType = er.command
,SQLStatement =
SUBSTRING
(
qt.text,
er.statement_start_offset/2,
(CASE WHEN er.statement_end_offset = -1
THEN LEN(CONVERT(nvarchar(MAX), qt.text)) * 2
ELSE er.statement_end_offset
END - er.statement_start_offset)/2
)
,ObjectName = OBJECT_SCHEMA_NAME(qt.objectid,dbid) + '.' + OBJECT_NAME(qt.objectid, qt.dbid)
,ElapsedMS = er.total_elapsed_time
,CPUTime = er.cpu_time
,IOReads = er.logical_reads + er.reads
,IOWrites = er.writes
,LastWaitType = er.last_wait_type
,StartTime = er.start_time
,Protocol = con.net_transport
,transaction_isolation =
CASE ses.transaction_isolation_level
WHEN 0 THEN 'Unspecified'
WHEN 1 THEN 'Read Uncommitted'
WHEN 2 THEN 'Read Committed'
WHEN 3 THEN 'Repeatable'
WHEN 4 THEN 'Serializable'
WHEN 5 THEN 'Snapshot'
END
,ConnectionWrites = con.num_writes
,ConnectionReads = con.num_reads
,ClientAddress = con.client_net_address
,Authentication = con.auth_scheme
FROM sys.dm_exec_requests er
LEFT JOIN sys.dm_exec_sessions ses
ON ses.session_id = er.session_id
LEFT JOIN sys.dm_exec_connections con
ON con.session_id = ses.session_id
OUTER APPLY sys.dm_exec_sql_text(er.sql_handle) as qt
WHERE @SessionID IS NULL OR er.session_id = @SessionID
AND er.session_id > 50
ORDER BY
er.blocking_session_id DESC
,er.session_id
END