web-dev-qa-db-ja.com

Management Studioで長いクエリが実行されているときにSQL Serverにアクセスできないのはなぜですか?

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
3
user47179

WebアプリケーションとSSMSクエリを調べないと、確実に言うことはできません。しかし、私の推測では、長いクエリはWebページが読み取りたいテーブルをロックしているため、ページはクエリが完了するまで待機する必要があります。これが発生する前にページのタイムアウトが発生し、ページの読み込みが失敗します。

あなたが扱っている概念は lockingconcurrency です。

テーブルの行数を取得する方法はいくつかあります。他のものよりも正確なものもあります。いくつかはより高速です。 この投稿 スタックオーバーフローに関するいくつかのアイデアを紹介します。


コメントへの応答:select count(*)..クエリは、テーブルのすべてのページを読み取ります。 SSMSステートメントは更新を実行しているため、一部のページに排他ロックが設定され、count(*)が続行できなくなります。これはまさに私が予想していたことです。

いくつかのオプションは次のとおりです。

  1. Stack Overflowから投稿を読んで、これらのオプションのいずれかが適切かどうかを判断してください。データテーブルに触れずに行数を取得する方法があります。
  2. トランザクションをコミットする前に、たとえば1000行のみを更新するように、更新をバッチ処理します。コミットによりロックが解除され、カウントが続行されます。
  3. here で説明されているカウントクエリにWITH (NOLOCK)を追加します。
  4. Webページのクエリに適切な分離レベルを明示的に宣言します。
  5. SQL Serverインスタンスのデフォルトの分離レベルを変更します。注-これはインスタンスのすべてのアクティビティに大きな影響を与えるため、経験豊富なSQL Server DBAとの慎重な詳細な議論の後にのみ実行する必要があります。
4
Michael Green

リモート接続クエリのタイムアウトです

テーブルの行数を使用するために保存するか、テーブルから行数を取得する効率的な方法を計画する必要があります。以下のクエリを試すことができます

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

2
vijayp