0

この記事https://web.archive.org/web/1/http://blogs.techrepublic%2ecom%2ecom/datacenter/?p=275の SQL を使用して、エラーの原因を突き止めようとしました。私のSQL Server 2005データベース内で最近起こっている多くのブロッキング。多くの場合、返されたすべてのプロセスが「関数の作成...」を呼び出しています。関数はさまざまですが、それらの多くは同じ関数を作成しています。記事に含まれる詳細から、およびテーブルの内容を見ると、結果セットが構築されているため、これらの create ステートメントが通常呼び出されているようには見えません。これは、問題の関数の再コンパイルを意味しますか? または、他の何か?

助けてくれてありがとう、

ロビン

4

1 に答える 1

4

sys.dm_exec_requests の statement_start_offset と statement_end_offsets を使用する必要があります (記事に示されているように sysprocesses を使用しないでください)。コードの問題のあるセクションを SUBSTRING で除外します。sys.dm_exec_sql_text()の BOL トピックの例を参照してください。

編集:

上記のことを行う方法は次のとおりです。

SELECT 
    spid = r.session_id, 
    BlockingSPID = r.blocking_session_id, 
    DatabaseName = DB_NAME(r.database_id),
    s.program_name,
    s.login_name,
    ObjectName = OBJECT_NAME(st.objectid, st.dbid),
    Definition = SUBSTRING(st.text, (r.statement_start_offset/2)+1, 
        ((CASE r.statement_end_offset
          WHEN -1 THEN DATALENGTH(st.text)
         ELSE r.statement_end_offset
         END - r.statement_start_offset)/2) + 1)
FROM sys.dm_exec_requests r
JOIN sys.dm_exec_sessions s ON r.session_id = s.session_id
CROSS APPLY sys.dm_exec_sql_text (sql_handle) st
WHERE r.session_id > 50

現在実行中の要求のみが dm_exec_requests DMV にあるため、出力は異なります。ここで、sysprocesses は実行中かどうかにかかわらず、すべての spid を示します。ただし、上記のコードでブロック ステートメントを見つけることができます。

于 2009-10-13T14:47:56.160 に答える