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 达到 370 亿时杀死了它,logical_reads但它经常被使用,当然也显示出来并开始了同样的模式。

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

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

其次,我如何知道用户定义的函数被调用了多少次?(并且可能是什么叫它

附带说明一下,我对该函数及其编写方式并不十分满意,但是除非这是“完全不正常”的行为,否则我目前没有时间重写它。

4

1 回答 1

0

要回答您的问题:

  1. 如果您的函数在显示挂起状态的同时连续运行了十分钟,我将使用您的第一个查询并检查以下列:wait_typewait_timelast_wait_typewait_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]%'
于 2013-07-18T21:57:02.940 回答