2

少し前に作成されたユーザー定義関数があり、次の時点から 1 週間以上「一時停止」ステータスとして表示されます。

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 億に達したときに SPID を終了させましたが、SPIDlogical_readsは非常に頻繁に使用されており、もちろんすぐに元に戻り、同じパターンを開始しました。

私の質問は、実際には 2 つの部分に分かれています。

まず、頻繁に使用されるユーザー定義関数が一時停止状態にあるのを見るのは、これは正常な動作ですか?

第二に、ユーザー定義関数が何回呼び出されたかをどのように知ることができますか? (そして潜在的にそれを呼んだもの

補足として、関数とその記述方法にはあまり満足していませんが、これが「完全に異常な」動作でない限り、現時点では書き直す時間がありません。

4

1 に答える 1

0

質問に答えるには:

  1. 一時停止状態を示している間、関数が 10 分間連続して実行されている場合、最初のクエリを使用して次の列を確認します: 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]%'
于 2013-07-18T21:57:02.940 に答える