SQL Serverデータベース(2012 Standardエディション)があります。データベースは、ページの読み込み時にさまざまなテーブルにあるデータベースの数を表示するASP.Net Webページを介してアクセスされます。
これは正常に機能しますが、Management Studioから長いクエリを実行すると、Webページの読み込みに失敗します。 Management Studioで長いクエリが実行されていると、データベースが応答しないようです。これは正常な動作ですか?
Webページで次のエラーが発生する-
Timeout expired. The timeout period elapsed prior to completion of the operation or
the server is not responding.
Description: An unhandled exception occurred during the execution of the current web
request. Please review the stack trace for more information about the error and where
it originated in the code.
Exception Details: System.Data.SqlClient.SqlException: Timeout expired. The timeout
period elapsed prior to completion of the operation or the server is not responding.
ソースエラー:
An unhandled exception was generated during the execution of the current web request.
Information regarding the Origin and location of the exception can be identified using
the exception stack trace below.
Stack Trace:
[SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to
completion of the operation or the server is not responding.]
System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean
breakConnection) +404
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() +412
WebアプリケーションとSSMSクエリを調べないと、確実に言うことはできません。しかし、私の推測では、長いクエリはWebページが読み取りたいテーブルをロックしているため、ページはクエリが完了するまで待機する必要があります。これが発生する前にページのタイムアウトが発生し、ページの読み込みが失敗します。
あなたが扱っている概念は locking と concurrency です。
テーブルの行数を取得する方法はいくつかあります。他のものよりも正確なものもあります。いくつかはより高速です。 この投稿 スタックオーバーフローに関するいくつかのアイデアを紹介します。
コメントへの応答:select count(*)..
クエリは、テーブルのすべてのページを読み取ります。 SSMSステートメントは更新を実行しているため、一部のページに排他ロックが設定され、count(*)
が続行できなくなります。これはまさに私が予想していたことです。
いくつかのオプションは次のとおりです。
WITH (NOLOCK)
を追加します。リモート接続クエリのタイムアウトです
テーブルの行数を使用するために保存するか、テーブルから行数を取得する効率的な方法を計画する必要があります。以下のクエリを試すことができます
SELECT
Total_Rows= SUM(st.row_count)
FROM
sys.dm_db_partition_stats st
WHERE
object_name(object_id) = 'TableName' AND (index_id < 2);
または:
SELECT
rowcnt
FROM
sys.sysindexes
WHERE
id = OBJECT_ID('TableName') AND indid in (0,1);
これをチェックしてください fastest-way-to-count-rows
リモート接続クエリタイムアウトの既定のSQL Server構成は600秒ですが、テスト目的でその値を増やして結果を確認できます。check msdn