2013-07-18 85 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倍真快) –