6列の単純なテーブルがあります。ほとんどの場合、挿入ステートメントは問題なく機能しますが、DBタイムアウト例外が発生することがあります。タイムアウトが期限切れになりました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。ステートメントは終了されました。
タイムアウトは10秒に設定されています。
私はNHibernateを使用しており、ステートメントには挿入自体の直後に「selectSCOPE_IDENTITY()」も含まれていることに注意してください。
私の考えでは、テーブルはロックされているか何かでしたが、その時点ではそのテーブルで実行されている他のステートメントはありませんでした。
すべての挿入は非常に単純で、SQLプロファイラーではすべてが正常に見えます。テーブルにはインデックスはありませんが、PKがあります(ページの完全性:98.57%)。
何を探すべきかについてのアイデアはありますか?
ありがとう。
QAには大きな結果セットを返すExcel接続がいくつかあり、それらのクエリはしばらくの間ASYNC_NETWORK_IOのWaitTypeで中断されました。この間、他のすべてのクエリがタイムアウトしたため、特定の挿入はそれとは何の関係もありませんでした。
あなたの最も可能性の高い原因は、別のトランザクションからの(またはトリガーまたは舞台裏での何かからの)ブロッキングロックだと思います。
最も簡単な方法は、INSERT
を開始し、ハングした状態で、同じサーバーの別のウィンドウでEXEC SP_WHO2
を実行することです。これにより、現在のすべてのデータベースアクティビティが一覧表示され、BLK
という列が表示され、現在ブロックされているプロセスがあるかどうかが示されます。ハングした接続のSPID
をチェックして、BLK
列に何かがあるかどうかを確認します。ある場合は、それがブロックしているプロセスです。
他のステートメントが実行されているとは思わない場合でも、確実に知る唯一の方法は、そのようなSP)を使用して現在のトランザクションをリストすることです。
この質問は、ブロックされたクエリとブロックされたクエリの実際の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 != ' .'
テーブルの成長に長い時間がかかっている可能性があります。
テーブルが大幅に大きくなるように設定されていて、ファイルの即時初期化が有効になっていない場合、クエリは確かに時々タイムアウトする可能性があります。
この混乱をチェックしてください: [〜#〜] msdn [〜#〜]
その時点でそのテーブルで実行されている他のステートメントはありません。
トランザクションの一部として他のテーブルに対して実行されるステートメントはどうですか?これにより、問題のテーブルにロックが残る可能性があります。
また、その時点で発生しているログファイルまたはデータファイルの増加を確認します。SQL2005を実行している場合は、SQLエラーログに表示されます。
テーブルの断片化を見てください。そのためにページが分割される可能性があります。