0

我已使用本文https://web.archive.org/web/1/http://blogs.techrepublic%2ecom%2ecom/datacenter/?p=275中的 sql来尝试追踪导致最近在我的 sql server 2005 数据库中发生了很多阻塞。很多时候,所有返回的进程都在调用“创建函数...”,函数各不相同,但其中一些将创建相同的函数。从文章中包含的详细信息以及查看表中的内容来看,结果集是从中构建的,看起来这些创建语句通常不会被调用。这是否意味着重新编译相关函数?或者是其他东西?

谢谢你的帮助,

罗宾

4

1 回答 1

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,执行与否。不过,您可以使用上面的代码找到您的阻塞语句。

于 2009-10-13T14:47:56.160 回答