2009-10-13 26 views
0

我已经使用这篇文章https://web.archive.org/web/1/http://blogs.techrepublic%2ecom%2ecom/datacenter/?p=275中的sql来试图追踪最近在我的sql server 2005数据库中发生的大量阻塞的原因。有很多次,所有返回的过程都调用'create function ...',这些函数会有所不同,但其中一些会创建相同的函数。从文章中包含的细节以及查看表中结果集的内容看起来,这些创建语句通常不会被调用。这是否意味着重新编译有问题的功能?或者是其他东西?SQL Server阻塞'创建函数...',这意味着什么?

感谢您的帮助,

罗宾

+0

你能告诉我们为什么你在运行时使用'CREATE FUNCTION'吗? – 2009-10-13 14:46:54

回答

4

您需要使用从sys.dm_exec_requests视图中的statement_start_offset和statement_end_offsets(不使用sysprocesses中所示的文章中),以SUBSTRING了问题的代码段。请参阅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是不同的,执行与否。尽管如此,你可以通过上面的代码找到你的阻塞语句。