MSSQL 锁表处理

本文介绍如何使用SQL Server的动态管理视图来检查事务执行时间、锁表情况及性能问题。通过查询语句展示如何查找长时间运行的事务、锁定表的进程并提供解决方法。

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;
 --上面查出的锁表SPID,很多都是同一个SPID引起,如果长时间一直不释放,就可以杀掉
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;

----杀掉单个锁表SPID SQL语句
DECLARE @spid INT;  
SET @spid = 71;
 --上面查出的锁表SPID,很多都是同一个SPID引起,如果长时间一直不释放,就可以杀掉::看哪个spid占用时间不在合理的范围内,就 kill 哪个。
DECLARE @sql VARCHAR(1000);
SET @sql = 'kill ' + CAST(@spid AS VARCHAR);
EXEC(@sq

3. 知识扩充

  1. 处理锁、阻塞和死锁(1)——确定长时间运行的事务
  2. MSSQL 管理视图
    1. sys.dm_tran_active_transactions
    2. sys.dm_tran_database_transactions
    3. 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'所用的CPU总时间ms'
        , total_elapsed_time/1000  N'总花费时间ms'
        , (total_elapsed_time / execution_count)/1000  N'平均时间ms'
        ,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 '%fetch%'
ORDER BY total_elapsed_time ,total_elapsed_time / execution_count DESC;
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值