我已经使用了本文https://web.archive.org/web/1/http://blogs.techrepublic%2ecom%2ecom/datacenter/?p=275中的sql来尝试跟踪最近在我的sql server 2005数据库中发生的大量阻塞的原因。很多次,返回的所有进程都调用'create function ...',函数有所不同,但是其中一些进程会创建相同的函数。从文章中包含的细节,以及查看表中的内容,结果集是从它构建的,看起来通常不会调用这些create语句。这是否意味着重新编译有问题的函数?或者是其他东西?
感谢您的帮助,
罗宾
答案 0 :(得分:4)
您需要使用sys.dm_exec_requests中的statement_start_offset和statement_end_offsets(不要使用文章中所示的sysprocesses)来删除有问题的代码段。请参阅sys.dm_exec_sql_text()的BOL主题中的示例。
编辑:
以下是如何做我上面所说的:
SELECT
spid = r.session_id,
BlockingSPID = r.blocking_session_id,
DatabaseName = DB_NAME(r.database_id),
s.program_name,
s.login_name,
ObjectName = OBJECT_NAME(st.objectid, st.dbid),
Definition = SUBSTRING(st.text, (r.statement_start_offset/2)+1,
((CASE r.statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE r.statement_end_offset
END - r.statement_start_offset)/2) + 1)
FROM sys.dm_exec_requests r
JOIN sys.dm_exec_sessions s ON r.session_id = s.session_id
CROSS APPLY sys.dm_exec_sql_text (sql_handle) st
WHERE r.session_id > 50
输出将会有所不同,因为只有当前正在执行的请求位于dm_exec_requests DMV中,其中sysprocesses显示每个spid,是否执行。您可以使用上面的代码找到阻止语句。