2013-07-18 31 views
2

我们有一个用户定义的函数创建前段时间其中显示了从为“暂停”状态了一个多星期:用户定义的功能是“暂停”状态是否正常?

USE master 
SELECT * 
FROM sys.dm_exec_requests 
CROSS APPLY sys.dm_exec_sql_text(sql_handle) 
ORDER BY start_time 

以上从查询该行有“状态”为“暂停”,并继续递增每个值:

cpu_time  
210262625 
total_elapsed_time 
623982642  
reads 
741700958 
reads 
19754 
logical_reads 
2938802909 

我以前杀了SPID当它达到了37十亿logical_reads,但它的使用非常普遍,当然显示右后卫,并开始这个模式。

我的问题确实分为两部分。

首先,这是一个常用的行为,大量使用的用户定义的函数看到它处于暂停状态?

其次,我该如何判断用户定义的函数被调用了多少次? (并且简单地称之为

作为一个方面说明,我不是很满意这个函数和它是如何写的,但是除非这是“完全不正常”的行为,我现在没有时间重写它。

回答

0

回答您的问题:

  1. 如果你的功能已十分钟持续运行,同时 显示暂停状态,我会用你的第一个查询和检查 下列:wait_typewait_timelast_wait_type ,和 wait_resource
  2. 要确定已调用函数的次数,请使用 第一个查询来捕获该函数的plan_handle。然后使用系统视图sys.dm_exec_cached_plans获取usecount。

例如:

SELECT 
    DB_NAME(dbid) AS db, 
    OBJECT_NAME(objectid) AS objName, 
    usecounts, 
    size_in_bytes, 
    cacheobjtype 
FROM sys.dm_exec_cached_plans 
CROSS APPLY sys.dm_exec_sql_text(plan_handle) 
WHERE plan_handle = 0x05000700A77A001140A10585000000000000000000000000 

这听起来像功能要么被一些类型的循环中执行,否则处理数据的巨量。

要检查所有可能从数据库中被调用函数的位置:

SELECT 
    OBJECT_NAME(object_id) AS objectName 
FROM sys.sql_modules 
WHERE definition LIKE '%[function_name]%' 
+0

这是一个有用的答案 - 原来的功能从用户活动调用,但也从一个SQL代理作业 - 以不同的方式,代理作业挂起,仍然需要深入探讨为什么,但它为我的“忍者sql查询杀手军刀攻击”的目标(现在说5倍真快) –