web-dev-qa-db-ja.com

SQLServerの単純なInsertステートメントがタイムアウトします

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

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

私はNHibernateを使用しており、ステートメントには挿入自体の直後に「selectSCOPE_IDENTITY()」も含まれていることに注意してください。

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

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

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

ありがとう。

21
Meidan Alon

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

3
Meidan Alon

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

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

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

34
SqlRyan

この質問は、ブロックされたクエリとブロックされたクエリの実際の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 != '  .'
25
andreister

テーブルの成長に長い時間がかかっている可能性があります。

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

この混乱をチェックしてください: [〜#〜] msdn [〜#〜]

5
Eam

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

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

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

4
SqlACID

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

0
SQLMenace