1. 查看当前事务执行时间
SELECT a.session_id ,
a.transaction_id ,
b.name ,
b.transaction_begin_time ,
DATEDIFF(MINUTE, b.transaction_begin_time, GETDATE()) '耗时(分)' ,
b.transaction_state
FROM sys.dm_tran_session_transactions a
JOIN sys.dm_tran_active_transactions b ON a.transaction_id = b.transaction_id
/*
sys.dm_tran_active_transactions
sys.dm_tran_database_transactions
sys.dm_tran_session_transactions
*/
----杀掉单个锁表SPID SQL语句
DECLARE @spid INT;
SET @spid = 60;
DECLARE @sql VARCHAR(1000);
SET @sql = 'kill ' + CAST(@spid AS VARCHAR);
EXEC(@sql)
2. 查看锁表情况,并 Kill
SELECT A.tableName ,
b.*
FROM ( SELECT request_session_id spid ,
OBJECT_NAME(resource_associated_entity_id) tableName
FROM sys.dm_tran_locks
WHERE resource_type = 'OBJECT'
) A
LEFT JOIN ( SELECT hostname ,
loginame ,
name ,
kpid ,
spid ,
A.[text] AS SQLText
FROM master.dbo.sysprocesses p
OUTER APPLY sys.dm_exec_sql_text(p.sql_handle) AS A
LEFT JOIN master.dbo.sysdatabases d ON p.dbid = d.dbid
WHERE hostname <> ''
AND loginame <> ''
) b ON A.spid = b.spid
AND A.tableName <> 'sysdbreg'
ORDER BY spid;
DECLARE @spid INT;
SET @spid = 71;
DECLARE @sql VARCHAR(1000);
SET @sql = 'kill ' + CAST(@spid AS VARCHAR);
EXEC(@sq
3. 知识扩充
- 处理锁、阻塞和死锁(1)——确定长时间运行的事务
- MSSQL 管理视图
- sys.dm_tran_active_transactions
- sys.dm_tran_database_transactions
- sys.dm_tran_session_transactions
SELECT creation_time N
,last_execution_time N
,total_physical_reads N
,total_logical_reads/execution_count N
,total_logical_reads N
,total_logical_writes N
, execution_count N
, total_worker_time/1000 N
, total_elapsed_time/1000 N
, (total_elapsed_time / execution_count)/1000 N
,SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE qs.statement_end_offset END
- qs.statement_start_offset)/2) + 1) N
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
where SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE qs.statement_end_offset END
- qs.statement_start_offset)/2) + 1) not like
ORDER BY total_elapsed_time ,total_elapsed_time / execution_count DESC;