すべては実際にどのようにクエリを実行しているかによって異なります。
は、次のクエリを想像:物事が起こるのだろう
SqlConnection myConnection = new SqlConnection("connection_string");
SqlCommand myCommand = new SqlCommand();
myCommand.Connection = myConnection;
myCommand.CommandType = CommandType.StoredProcedure;
myCommand.CommandTimeout = some_long_time;
myCommand.CommandText = "database_killing_procedure_lol";
myConnection.Open() //Connection's now open
myCommand.ExecuteNonQuery();
つを。このメソッドはcommand.ExecuteNonQuery()が終了するまでキューに入れられます。もう1つは、メソッドの実行中に接続プールから接続を引き継ぐことです。
タイムアウトするとどうなりますか?さて、例外がスローされます。つまり、Numberプロパティが-2のSqlExceptionです。ただし、上記のコードでは、例外管理はないので、オブジェクトは範囲外になり、オブジェクトが処分されるまで待つ必要があります。特に、私たちの接続はこれが起こるまで再利用できません。
それは以下のパターンが好まれる理由の一つだ:それは、すぐにクエリが完了すると、いずれかの自然に(それが完了するまで実行)、ということを意味
using(SqlConnection myConnection = new SqlConnection("connection_string"))
{
using(SqlCommand myCommand = new SqlCommand())
{
SqlCommand myCommand = new SqlCommand();
myCommand.Connection = myConnection;
myCommand.CommandType = CommandType.StoredProcedure;
myCommand.CommandTimeout = some_long_time;
myCommand.CommandText = "database_killing_procedure_lol";
myConnection.Open() //Connection's now open
myCommand.ExecuteNonQuery();
}
}
または例外によって(タイムアウトまたはそれ以外の場合)、リソースはとすぐに返されます。
特定の問題では、実行に時間がかかります多数のクエリを持つことは、多くの理由で悪いことです。 Webアプリケーションでは、限られた数のリソースに対して多数のユーザーが競合する可能性があります。メモリ、データベース接続、CPU時間などが含まれます。したがって、これらのいずれかを高価な操作で縛ると、Webアプリケーションの応答性とパフォーマンスが低下したり、同時に処理できるユーザー数が制限されたりします。さらに、データベース操作が高価な場合は、データベースを縛ることもできます。
この理由だけで、データベースクエリの実行時間を延ばそうとするのは、常に価値があります。できない場合は、同時に実行できるクエリの種類についていくつか注意する必要があります。
EDIT:
ですから、実際にSQL Serverの側で何が起こっているかに興味がある...答えは、それが依存...です! CommandTimeoutは実際にはクライアントイベントです。あなたが言っていることは、クエリがn秒以上かかると、それ以上待たずに済むということです。 SQL Serverはこれが当てはまると言われますが、現在実行中の処理を処理しなければならないため、SQL Serverがクエリを終了するまでに実際に時間がかかることがあります。これは優先順位をつけようとしますが、それはそれです。
これは特にトランザクションに当てはまります。トランザクションでラップされたクエリを実行していて、それを例外管理の一部としてロールバックしている場合は、ロールバックが完了するまで待つ必要があります。
人々がパニックを起こして、クエリが実行されているSQLプロセスIDに対してコマンドKILLを発行することも非常に一般的です。これは、コマンドがトランザクションを実行していると間違っていることがよくありますが、しばしばロング・ランニング・セレクトでは問題ありません。
SQL Serverは、一貫性を保つように状態を管理する必要があります。クライアントがもうリッスンしていないということは、無駄な作業をしたことを意味しますが、SQL Serverはそれ自身の後でクリーンアップする必要があります。
はい、ASP.Net側は気にしませんが、SQL Serverはまだ開始した作業を完了するか、その作業を安全に破棄できるポイントに到達する必要があります。開いたトランザクションの変更をロールバックします。
これは明らかに、クエリに応じてデータベースサーバーに影響を与える可能性があります。
トランザクションの外部で長時間実行されているSELECTまたはUPDATEまたはINSERTも終了する必要があります。 SQL Serverはできるだけ早くそれを試み、放棄しますが、それが安全である場合に限ります。明らかに、UPDATESとINSERTの場合、特にデータベースが一貫している点に到達する必要があります。 SELECTのためにできるだけ早く終了しようとします。
いいえ。方法はありません - SQL Server上で実行中のプロセスを強制終了できますが、実際にSQL Serverが実行していることを管理する必要があります。すべての場合と同様に、サーバーのパフォーマンスを低下させるクエリを実行することを選択した場合、それはあなたの選択です:-) – dash
SQL KILLコマンドを使用してSQL Server上で実行中のプロセスを強制終了できます。 KILL SPIDを使用し、SPIDを取得するにはSELECT @@ SPIDを使用するか、sysテーブルのいずれかから現在のプロセスをすべて取得します。 –