SQLServer 大容量导入导致死锁和系统变慢问题

SQLServer 大容量导入导致死锁和系统变慢问题,第1张

概述今天测试同事反馈系统变得比较慢,看看什么原因。 按常理,用几个日常排除语句: --当前正在执行的语句SELECTder.[session_id],der.[blocking_session_id],sp.lastwaittype,sp.hostname,sp.program_name,sp.loginame,der.[start_time] AS '开始时间',der.[status]

今天测试同事反馈系统变得比较慢,看看什么原因。


按常理,用几个日常排除语句:

--当前正在执行的语句SELECTder.[session_ID],der.[blocking_session_ID],sp.lastwaittype,sp.hostname,sp.program_name,sp.loginame,der.[start_time] AS '开始时间',der.[status] AS '状态',dest.[text] AS 'SQL语句',DB_name(der.[database_ID]) AS '数据库名',der.[wait_type] AS '等待资源类型',der.[wait_time] AS '等待时间',der.[wait_resource] AS '等待的资源',der.[logical_reads] AS '逻辑读次数'FROM sys.[dm_exec_requests] AS derINNER JOIN master.dbo.sysprocesses AS sp ON der.session_ID=sp.spIDCROSS APPLY  sys.[dm_exec_sql_text](der.[sql_handle]) AS destWHERE [session_ID]>50 AND session_ID<>@@SPIDORDER BY der.[session_ID]GO--是否堵塞SELECT spID,blocked,waittime,waittype,waitresource,p.dbID,cpu,physical_io,memusage,open_tran,status,login_time,last_batch,hostname,program_name,hostprocess,loginame,cmd,textFROM master.dbo.sysprocesses p CROSS APPLY sys.dm_exec_sql_text(p.sql_handle) sWHERE blocked > 0 OR spID IN(SELECT blocked FROM master.dbo.sysprocesses WHERE blocked > 0)go --是否有未提交事物select spID,text  from master.dbo.sysprocesses p cross apply sys.dm_exec_sql_text(p.sql_handle) s  where open_tran <> 0  go  --死锁 drop table #deadlockCREATE table #deadlock(LogDate DATETIME,ProcessInfo VARCHAR(20),Text VARCHAR(2000))goINSERT INTO #deadlock EXEC xp_readerrorlog 0,1,'deadlock victim',NulL,'2016-07-20 14:00:00','2016-07-30','DESC'  go

发现较多进程正在等待某个表资源,从中查看是什么表。

waitresource/等待的资源 TAB: 7:1028198713:7select OBJECT_name(1028198713)

同时看看有没有发生死锁,果然有死锁!(提前开启死锁跟踪: traceon(1222,-1))

死锁资源列表如下:

  resource-List   objectlock lockPartition=27 objID=629577281 subresource=FulL dbID=7 objectname=MYDB.dbo.mytable ID=lock1bdc37b280 mode=Sch-S associatedobjectID=629577281    owner-List     owner ID=processe51d948 mode=Sch-S     owner ID=processe4bf288 mode=Sch-S    waiter-List     waiter ID=process2b95dcc508 mode=Sch-M requestType=wait   objectlock lockPartition=23 objID=629577281 subresource=FulL dbID=7 objectname=MYDB.dbo.mytable ID=lock1bfb3d7680 mode=Sch-M associatedobjectID=629577281    owner-List     owner ID=process2b95dcc508 mode=Sch-M    waiter-List     waiter ID=process5c53dc8 mode=IS requestType=wait   objectlock lockPartition=19 objID=629577281 subresource=FulL dbID=7 objectname=MYDB.dbo.mytable ID=lock1d20baba80 mode=Sch-M associatedobjectID=629577281    owner-List    waiter-List     waiter ID=processe4bf288 mode=Sch-S requestType=wait   objectlock lockPartition=23 objID=629577281 subresource=FulL dbID=7 objectname=MYDB.dbo.mytable ID=lock1bfb3d7680 mode=Sch-M associatedobjectID=629577281    owner-List    waiter-List     waiter ID=processe51d948 mode=Sch-S requestType=wait   objectlock lockPartition=19 objID=629577281 subresource=FulL dbID=7 objectname=MYDB.dbo.mytable ID=lock1d20baba80 mode=Sch-M associatedobjectID=629577281    owner-List     owner ID=process2b95dcc508 mode=Sch-M    waiter-List     waiter ID=processe480988 mode=IS requestType=wait

可以看到,出现了架构稳定锁(Sch-S)和架构修改锁(Sch-M),但是数据库没有人修改架构啊!查看审核信息也无人修改过表对象。什么原因??!

继续使用上面的排查语句进行多次查询,发现了一条特殊的语句!

insert bulk [dbo].[tableS_Writes](此处省略字段)
果然是该语句了!大容量插入是要表级别的锁,并且也会出现架构锁。其他等待资源的进程,也是需要查询该表的,所以才出现了表级别的资源等待!而恰巧,要使用该表的是一个存储过程,也是比较复杂的,执行10秒以上,该存储过程使用的其实是一个视图,视图中包含了该表!暂时解决的话。在视图上加nolock。询问开发人员,说大容量导入 *** 作随时发生的,因为有些数据是需要业务员 *** 作导入的。这种方法以后还是得改,要么大容量先插入到一个中间表,再插入到当前表中。 总结

以上是内存溢出为你收集整理的SQLServer 大容量导入导致死锁和系统变慢问题全部内容,希望文章能够帮你解决SQLServer 大容量导入导致死锁和系统变慢问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1170880.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存