【问题标题】:User defined function is "suspended" state is this normal?用户定义函数处于“暂停”状态这正常吗?
【发布时间】:2013-07-17 13:53:00
【问题描述】:

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

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 时杀死了它,但它经常被使用,当然会立即显示并启动相同的模式。

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

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

其次,如何知道用户定义的函数被调用了多少次? (以及可能的名称

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

【问题讨论】:

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


    【解决方案1】:

    回答你的问题:

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

    【讨论】:

    • 这是一个有用的答案 - 原来该函数是从用户活动调用的,但也从 SQL 代理作业调用 - 以不同的方式,代理作业挂起,仍然需要深入研究原因,但它得到了我是我的“忍者 sql 查询杀手 saber 攻击”的目标(现在说真的快 5 倍)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多