查询数据库死锁

关于死锁:

sp_who active  –看看哪个引起的死锁, blk里面即阻塞的spid;

dbcc inputbuffer(@blk) — 可以查看是那个sql语句造成的死锁;

sp_lock  –看看锁住了那个资源,objid即被锁住的资源id;

select object_name(objid) 可得到受影响的表名;

综合以上功能,我们可以写一个自动查找死锁的存储过程,如下:

CREATE PROCEDURE Find_Lock AS 
BEGIN SET NOCOUNT ON; 
declare @spid int,@blk int 
DECLARE cur CURSOR FOR 
select 0 ,blocked from (select * from master..sysprocesses where blocked>0 ) a 
where not exists(select * from (select * from master..sysprocesses where blocked>0 ) b where a.blocked=spid) 
union 
select spid,blocked from master..sysprocesses where blocked>0
 
OPEN cur FETCH NEXT FROM cur INTO @spid,@blk WHILE @@FETCH_STATUS = 0 
begin 
if @spid =0 
select ' 引起死锁的进程号是 : '+ CAST(@blk AS VARCHAR(10)) + ', 其执行的 SQL 语法如下 ' 
else 
select ' 进程号 SPID : '+ CAST(@spid AS VARCHAR(10))+ 
' 被 ' + ' 进程号 SPID : '+ CAST(@blk AS VARCHAR(10)) +' 阻塞 , 其当前进程执行的 SQL 语法如下 ' 
DBCC INPUTBUFFER (@blk ) 
FETCH NEXT FROM cur INTO @spid,@blk end 
CLOSE cur 
DEALLOCATE cur 
END 
--EXEC Find_Lock
sqlserver性能优化:

exec sp_configure 'awe enabled','1' --内存可以支持64g

exec sp_configure 'lightweight pooling','0'  --不使用nt纤程

exec sp_configure 'priority boost','1'  --增加sqlserver优先级

exec sp_configure 'network packet size (b)','8192'   --增加sqlserver网络包的大小

reconfigure with override

–优化数据库设置

declare @currentdatabase sysname

select @currentdatabase = db_name((select dbid from master.dbo.sysprocesses WHERE spid = @@spid))

exec sp_dboption @currentdatabase, 'select into/bulkcopy', 'true' --对大容量数据操作不记录日志

exec  sp_dboption @currentdatabase, 'trunc. log on chkpt.', 'true' --自动截断日志

exec  sp_dboption @currentdatabase, 'auto create statistics', 'true'  --自动创建统计

exec  sp_dboption @currentdatabase, 'auto update statistics', 'true'  --自动更新统

经常用 DBCC showcontig(表名) 查看表的碎片, 主要查看扫描密度 ,如果主要的大表扫描密度 < 40%, 意味着你有严重的碎片可以用DBCC indexDefrag (数据库名,表名)整理碎片或者用DBCC DBREINDEX(表名) 重建 index.

查看阻塞情况: 等待类型为LCK_M_S:“当某任务正在等待获取共享锁时出现”



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值