我有一个由于超时而关闭的应用程序。在这些时间里,我们看到保存 ASP 会话状态的数据库的响应时间大幅增加。
为了诊断我使用的问题SP_CONFIGURE'blocked process threshold',15
并运行跟踪以捕获任何被触发的事件。在下一次事件期间,跟踪捕获会话状态数据库中的一些阻塞事件。
我已经确定了主要拦截器,并且可以看到它已暂停并等待。
<blocked-process-report>
<blocked-process>
<process id="process53fb4c8"
taskpriority="0" logused="0"
waitresource="KEY: 10:72057594039238656 (594b17b7493c)" waittime="20631"
ownerId="9710782702" transactionname="UPDATE"
lasttranstarted="2013-06-27T17:29:38.130" XDES="0xc429df950" lockMode="U"
schedulerid="14" kpid="6912" status="suspended" spid="359" sbid="0" ecid="0"
priority="0" trancount="2" lastbatchstarted="2013-06-27T17:29:38.130"
lastbatchcompleted="2013-06-27T17:29:38.107"
clientapp=".Net SqlClient Data Provider" hostname="WEB03" hostpid="7520"
loginname="State" isolationlevel="read committed (2)" xactid="9710782702"
currentdb="10" lockTimeout="4294967295"
clientoption1="536870944" clientoption2="128056">
<executionStack>
<frame line="18" stmtstart="1114" stmtend="4494"
sqlhandle="0x03000a00210f020741a1be0058a000000100000000000000"/>
</executionStack>
<inputbuf>
Proc [Database Id = 10 Object Id = 117575457]
</inputbuf>
</process>
</blocked-process>
<blocking-process>
<process status="suspended" waittime="1046" spid="217" sbid="0" ecid="0"
priority="0" trancount="1" lastbatchstarted="2013-06-27T17:29:29.113"
lastbatchcompleted="2013-06-27T17:29:29.010"
clientapp=".Net SqlClient Data Provider" hostname="WEB02" hostpid="6236"
loginname="CState" isolationlevel="read committed (2)" xactid="9710776428"
currentdb="10" lockTimeout="4294967295" clientoption1="536870944"
clientoption2="128056">
<executionStack>
<frame line="18" stmtstart="1114" stmtend="4494"
sqlhandle="0x03000a00210f020741a1be0058a000000100000000000000"/>
</executionStack>
<inputbuf>
Proc [Database Id = 10 Object Id = 117575457]
</inputbuf>
</process>
</blocking-process>
</blocked-process-report>
我的问题是
- 时间单位是
waittime="1046"
什么? - 等待什么资源?
- 然后去哪儿?
被阻塞的进程正在等待一个 KEY(因此是一行),时间为 20631 毫秒(~20 秒)。
阻塞事务仍在执行语句,可能是导致阻塞的 UPDATE。它没有被阻塞,如果它被阻塞,那么它就不会是等待链的顶端。正在执行,现在被挂起(不是阻塞!),这意味着它刚刚产生了 CPU。
看起来您有一个长时间运行的 UPDATE 语句,很可能它缺少索引并触发了阻塞所有读取器的表扫描。
sys.dm_exec_sql_text
在句柄上使用0x03000a00210f020741a1be0058a000000100000000000000
以检索正在执行的确切语句。顺便说一句,您被阻止的进程是完全相同的 UPDATE (相同的句柄,相同的过程,相同的偏移量),这并不奇怪。看起来您的对象 id 为 117575457 的存储过程包含未优化的更新。