用户定义的功能是“暂停”状态是这样正常吗?

时间:2013-07-18 14:33:50

标签: sql-server sql-server-2008 user-defined-functions

我们之前创建了一个用户定义的函数,该函数在一周内显示为“暂停”状态:

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

上面查询中的行将“status”视为“已暂停”并继续为每个值增加值:

cpu_time    
210262625
total_elapsed_time
623982642    
reads
741700958   
reads
19754
logical_reads
2938802909

我之前已经杀死了SPID达到370亿logical_reads但它经常被使用,当然也显示出正确的备份并启动了相同的模式。

我的问题实际上分为两部分。

首先,对于频繁使用的用户定义函数来说,这是正常的行为吗?它是否处于挂起状态?

其次,如何判断调用用户定义函数的次数? (并且实际上称之为

作为旁注,我对这个功能及其编写方式并不满意,但除非这是“完全异常”的行为,否则我目前没有时间重写它。

1 个答案:

答案 0 :(得分:0)

回答你的问题:

  1. 如果您的功能连续运行了十分钟 显示暂停状态,我会使用您的第一个查询并检查 以下列:wait_typewait_timelast_wait_typewait_resource
  2. 要确定调用该函数的次数,请使用 第一个查询捕获函数的plan_handle。然后使用系统视图sys.dm_exec_cached_plans获取usecount。
  3. 例如:

    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]%'