LOGO 首页 OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 技术文档 其他文档  
 
网站管理员

Sqlserver数据库死锁查询

admin
2026年10月17日 12:52 本文热度 175
1、查看被锁的表SELECT  request_session_id spid ,        OBJECT_NAME(resource_associated_entity_id) tableNameFROM    sys.dm_tran_locksWHERE   resource_type = 'OBJECT';

2、解锁DECLARE @spid INT; SET @spid = 119; --锁表进程DECLARE @sql VARCHAR(1000);SET @sql = 'kill ' + CAST(@spid AS VARCHAR);EXEC(@sql);

--查询占用CPU的前10个语句SELECT TOP 100   total_worker_time/execution_count AS avg_cpu_cost, plan_handle,   execution_count,   (SELECT SUBSTRING(text, statement_start_offset/2 + 1,      (CASE WHEN statement_end_offset = -1         THEN LEN(CONVERT(nvarchar(max), text)) * 2         ELSE statement_end_offset      END - statement_start_offset)/2)   FROM sys.dm_exec_sql_text(sql_handle)) AS query_textFROM sys.dm_exec_query_statsORDER BY [avg_cpu_cost] DESC

-- 总耗CPU最多的SELECT TOP 100total_worker_time,max_worker_time,   total_worker_time/execution_count AS avg_cpu_cost,   execution_count,last_execution_time,   (SELECT SUBSTRING(text, statement_start_offset/2 + 1,      (CASE WHEN statement_end_offset = -1         THEN LEN(CONVERT(nvarchar(max), text)) * 2         ELSE statement_end_offset      END - statement_start_offset)/2)   FROM sys.dm_exec_sql_text(sql_handle)) AS query_text,plan_handleFROM sys.dm_exec_query_statsORDER BY total_worker_time DESC

--查询执行计划select * from sys.dm_exec_query_plan(0x06000A006C13972E40013B3F010000000000000000000000)

SELECT dbid,spid,cpu,physical_io,memusage,login_time,last_batch,status,blocked FROM [Master].[dbo].[SYSPROCESSES] WHERE [DBID] IN (SELECT [DBID]FROM [Master].[dbo].[SYSDATABASES] WHERE NAME='CRM_DB')
SELECT *FROM [Master].[dbo].[SYSDATABASES] 

sp_who active  --看看哪个引起的死锁, blk里面即阻塞的spid;  
dbcc inputbuffer(129) -- 可以查看是哪个sql语句造成的死锁;  
kill 92   

sp_lock  --看看锁住了那个资源,objid即被锁住的资源id;  select * from sys.objects where object_id = 293576084 --可得到受影响的表名; 
SELECT * FROM sys.syslockinfo
SELECT * FROM sys.sysprocesses

--查看CPU数和user scheduler数目SELECT cpu_count,scheduler_count FROM sys.dm_os_sys_info --查看最大工作线程数SELECT max_workers_count FROM sys.dm_os_sys_info

SELECTscheduler_address,scheduler_id,cpu_id,status,current_tasks_count,current_workers_count,active_workers_countFROM sys.dm_os_schedulers

SELECT * FROM sys.[sysprocesses] WHERE [spid]>50 --AND DB_NAME([dbid])='gposdb'SELECT COUNT(*) FROM [sys].[dm_exec_sessions] WHERE [session_id]>50

---这个语句选取了前10个最耗CPU时间的会话SELECT TOP 10[session_id],[request_id],[start_time] AS '开始时间',[status] AS '状态',[command] AS '命令',dest.[text] AS 'sql语句', DB_NAME([database_id]) AS '数据库名',[blocking_session_id] AS '正在阻塞其他会话的会话ID',[wait_type] AS '等待资源类型',[wait_time] AS '等待时间',[wait_resource] AS '等待的资源',[reads] AS '物理读次数',[writes] AS '写次数',[logical_reads] AS '逻辑读次数',[row_count] AS '返回结果行数'FROM sys.[dm_exec_requests] AS der CROSS APPLY sys.[dm_exec_sql_text](der.[sql_handle]) AS dest WHERE DB_NAME(der.[database_id])='CRM_DB'  ORDER BY [cpu_time] DESC

--执行下面语句就会显示出会话中有多少个worker在等待SELECT TOP 10 [session_id], [request_id], [start_time] AS '开始时间', [status] AS '状态', [command] AS '命令', dest.[text] AS 'sql语句',  DB_NAME([database_id]) AS '数据库名', [blocking_session_id] AS '正在阻塞其他会话的会话ID', der.[wait_type] AS '等待资源类型', [wait_time] AS '等待时间', [wait_resource] AS '等待的资源', [dows].[waiting_tasks_count] AS '当前正在进行等待的任务数', [reads] AS '物理读次数', [writes] AS '写次数', [logical_reads] AS '逻辑读次数', [row_count] AS '返回结果行数' FROM sys.[dm_exec_requests] AS der  INNER JOIN [sys].[dm_os_wait_stats] AS dows  ON der.[wait_type]=[dows].[wait_type] CROSS APPLY  sys.[dm_exec_sql_text](der.[sql_handle]) AS dest  --WHERE [session_id]>50   ORDER BY [cpu_time] DESC

--查询缺失索引SELECT     DatabaseName = DB_NAME(database_id)    ,[Number Indexes Missing] = count(*) FROM sys.dm_db_missing_index_detailsGROUP BY DB_NAME(database_id)ORDER BY 2 DESC;

SELECT  TOP 100        [Total Cost]  = ROUND(avg_total_user_cost * avg_user_impact * (user_seeks + user_scans),0)         , avg_user_impact        , TableName = statement        , [EqualityUsage] = equality_columns         , [InequalityUsage] = inequality_columns        , [Include Cloumns] = included_columnsFROM        sys.dm_db_missing_index_groups g INNER JOIN    sys.dm_db_missing_index_group_stats s        ON s.group_handle = g.index_group_handle INNER JOIN    sys.dm_db_missing_index_details d        ON d.index_handle = g.index_handleORDER BY [Total Cost] DESC;

--显示索引使用情况--user_seeks和user_scans字段都为0的,考虑是否为垃圾索引--另外last_user_seek,last_user_scan如果是一个很早的时间,则考虑是否应用变化 导致该索引不被使用了SELECT i.name indexname,user_seeks,user_scans,last_user_seek,last_user_scanFROM sys.dm_db_index_usage_stats sINNER JOIN sys.indexes i ONs.object_id = i.object_id ANDs.index_id = i.index_idWHERE database_id = db_id('CRM_DB') --AND s.object_id = object_id('IDVerifyTbl');

select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName  
from   sys.dm_tran_locks where resource_type='OBJECT' and OBJECT_NAME(resource_associated_entity_id)='CopyrightRecord'

select * from sys.dm_tran_locks 
-- 查询死锁后解锁select   request_session_id   spid,OBJECT_NAME(resource_associated_entity_id) tableName   from   sys.dm_tran_locks where resource_type='OBJECT'
declare @spid  int Set @spid  = 168 --锁表进程declare @sql varchar(1000)set @sql='kill '+cast(@spid  as varchar)exec(@sql)
use mastergodeclare @spid int,@bl int,@intTransactionCountOnEntry int, @intRowcount int,@intCountProperties int, @intCounter intcreate table #tmp_lock_who (id int identity(1,1),spid smallint,bl smallint)insert into #tmp_lock_who(spid,bl) select 0 ,blockedfrom (select * from sysprocesses where blocked>0 ) awhere not exists(select * from (select * from sysprocesses where blocked>0 ) bwhere a.blocked=spid)union select spid,blocked from sysprocesses where blocked>0-- 找到临时表的记录数select @intCountProperties = Count(*),@intCounter = 1 from #tmp_lock_whoif @intCountProperties=0select N'现在没有阻塞和死锁信息' as message-- 循环开始while @intCounter <= @intCountPropertiesbegin-- 取第一条记录select @spid = spid,@bl = bl from #tmp_lock_who where Id = @intCounterbeginif @spid =0select N'引起数据库死锁的是: '+ CAST(@bl AS VARCHAR(10)) + N'进程号,其执行的SQL语法如下'elseselect N'进程号SPID:'+ CAST(@spid AS VARCHAR(10))+ N'被' + N'进程号SPID:'+ CAST(@bl AS VARCHAR(10)) +N'阻塞,其当前进程执行的SQL语法如下'DBCC INPUTBUFFER (@bl )end-- 循环指针下移set @intCounter = @intCounter + 1enddrop table #tmp_lock_who


该文章在 2026/10/17 12:54:36 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved  粤ICP备13012886号-9  粤公网安备44030602007207号