23

6列の単純なテーブルがあります。ほとんどの場合、挿入ステートメントは正常に機能しますが、たまに DB タイムアウト例外が発生します: タイムアウトが期限切れになりました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。ステートメントは終了されました。

タイムアウトは 10 秒に設定されています。

私は NHibernate を使用していること、およびステートメントには挿入自体の直後に「select SCOPE_IDENTITY()」も含まれていることに言及する必要があります。

私の考えでは、テーブルがロックされているか何かでしたが、その時点でそのテーブルで実行されているステートメントは他にありませんでした。

すべての挿入は非常に単純で、SQL プロファイラーではすべてが正常に見えます。テーブルにはインデックスはありませんが、PK があります (ページの占有率: 98.57 %)。

何を探すべきかについてのアイデアはありますか?

ありがとう。

4

6 に答える 6

36

あなたの最も可能性の高い原因は、別のトランザクションからのロックのブロックです(または、トリガーや舞台裏の何かからのものかもしれません)。

確認する最も簡単な方法は、 を起動し、INSERTハングしている間にEXEC SP_WHO2同じサーバーの別のウィンドウで実行することです。これにより、現在のデータベース アクティビティがすべて一覧表示BLKされ、現在ブロックされているプロセスがあるかどうかを示す列が表示されます。SPIDハングした接続をチェックして、BLK列に何かがあるかどうかを確認します。ある場合は、それがブロックしているプロセスです。

他に実行中のステートメントがないと思われる場合でも、確実に知る唯一の方法は、そのような SP を使用して現在のトランザクションを一覧表示することです。

于 2009-01-16T05:50:30.487 に答える
29

この質問は、ブロックされたクエリとブロックされたクエリの実際の SQL テキストを確認するために使用したコード スニペットの適切な場所のようです。

以下のスニペットは、SP_WHO2「 . 」を返す規則を採用しています。ブロックされていないクエリのテキストBlockedByを除外し、残りのクエリ (「被害者」と「犯人」の両方) の SQL テキストを返します。

--prepare a table so that we can filter out sp_who2 results
DECLARE @who TABLE(BlockedId INT, 
                   Status VARCHAR(MAX), 
                   LOGIN VARCHAR(MAX), 
                   HostName VARCHAR(MAX), 
                   BlockedById VARCHAR(MAX), 
                   DBName VARCHAR(MAX), 
                   Command VARCHAR(MAX), 
                   CPUTime INT, 
                   DiskIO INT, 
                   LastBatch VARCHAR(MAX), 
                   ProgramName VARCHAR(MAX), 
                   SPID_1 INT, 
                   REQUESTID INT)
INSERT INTO @who EXEC sp_who2

--select the blocked and blocking queries (if any) as SQL text
SELECT 
(
    SELECT TEXT 
    FROM sys.dm_exec_sql_text(
       (SELECT handle 
        FROM (
            SELECT CAST(sql_handle AS VARBINARY(128)) AS handle
            FROM sys.sysprocesses WHERE spid = BlockedId
        ) query)
    )
) AS 'Blocked Query (Victim)',
(
    SELECT TEXT 
    FROM sys.dm_exec_sql_text(
       (SELECT handle 
        FROM (
            SELECT CAST(sql_handle AS VARBINARY(128)) AS handle
            FROM sys.sysprocesses WHERE spid = BlockedById
        ) query)
    )
) AS 'Blocking Query (Culprit)'
FROM @who 
WHERE BlockedById != '  .'
于 2011-11-11T14:11:55.077 に答える
5

テーブルが大きくなるのに時間がかかっている可能性があります。

テーブルが大量に拡大するように設定されていて、ファイルの即時初期化が有効になっていない場合、クエリは時々タイムアウトする可能性があります。

この混乱をチェックしてください: MSDN

于 2009-01-16T06:04:35.777 に答える
4

その時点でそのテーブルで実行されている他のステートメントはありません。

トランザクションの一部として他のテーブルに対して実行されるステートメントについてはどうでしょうか? これにより、問題のテーブルにロックが残る可能性があります。

また、その時点で発生しているログ ファイルまたはデータファイルの増大をチェックします。SQL2005 を実行している場合は、SQL エラー ログに表示されます。

于 2009-01-15T18:02:56.717 に答える
3

私たちの QA には、大きな結果セットを返す Excel 接続がいくつかありました。これらのクエリは、ASYNC_NETWORK_IO の WaitType でしばらく中断されました。この間、他のすべてのクエリがタイムアウトしたため、特定の挿入はそれとは関係ありませんでした。

于 2009-01-19T08:51:15.770 に答える
1

テーブルの断片化を見てください。そのためにページ分割が発生している可能性があります

于 2009-01-15T15:38:29.380 に答える