sqlserver 不管是排查死鎖仍是排查性能問題都離不開SQL Server Profiler ,死鎖主要勾選哪裏:sql
--查詢死鎖總數,若是死鎖較多建議重啓sqlserver服務
SELECT cntr_value AS NumOfDeadLocks
FROM sys.dm_os_performance_counters
WHERE object_name = 'SQLServer:Locks'
AND counter_name = 'Number of Deadlocks/sec'
AND instance_name = '_Total'安全
--查詢死鎖的spid
select
request_session_id spid,
OBJECT_NAME(resource_associated_entity_id) tableName
from
sys.dm_tran_locks
where
resource_type='OBJECT' session
--刪除死鎖
kill 70dom
注意:死鎖較多時,安全的作法是重啓sqlserver服務sqlserver
--如下爲查詢具體死鎖的sql
CREATE FUNCTION [dbo].[DigLock]
(
@spid int,
@orginSpid int
)
RETURNS bit
AS
BEGIN
declare @blockedSpid int=null;
select @blockedSpid=spid from master.dbo.sysprocesses where blocked<>0 and blocked=@spid
if @blockedSpid=@orginSpid
return 1;--檢測到了死鎖
if @blockedSpid is not null
begin
return dbo.DigLock(@blockedSpid,@orginSpid);
end
return 0;--未檢測到死鎖
END性能
CREATE VIEW [dbo].[V_DeadLock_Process]
AS
SELECT spid, kpid, blocked, waittype, waittime, lastwaittype, waitresource, dbid, uid, cpu, physical_io, memusage, login_time,
last_batch, ecid, open_tran, status, sid, hostname, program_name, hostprocess, cmd, nt_domain, nt_username,
net_address, net_library, loginame, context_info, sql_handle, stmt_start, stmt_end, request_id
FROM sys.sysprocesses AS sp1
WHERE (blocked <> 0) AND (dbo.DigLock(spid, spid) = 1)優化
Select * from [dbo].[V_DeadLock_Process]
DBCC INPUTBUFFER (53)--輸入會話spid,可查詢該會話正在執行的Sql語句,從而知道發生死鎖的會話執行了什麼Sql語句
--優化方式:1.建立非彙集索引 2.查詢使用with (nolock)方式 ui