0

現在、SQL データベース内のさまざまなテーブルでレポートを実行するレポート プログラムを作成する必要があります。複数の異なるクライアントがこの機能を必要としますが、一部のクライアントは他のクライアントよりも大きなデータベースを持っています。私が知りたいのは、「あまりにも」時間がかかっている場合、一定期間後にクエリを停止できるかどうかです。

状況を説明するために、一部のクライアントには 200 万行を超えるテーブルがありますが、別のクライアントでは同じテーブルに 50,000 行しかない場合があります。たとえば 20 秒間クエリを実行できるようにしたいのですが、それまでに終了していない場合は、結果セットが大きすぎるため、時間外にレポートを生成する必要があるというメッセージをユーザーに返します。日中はリソースを大量に消費する操作を実行したくありません。

4

2 に答える 2

5

接続文字列またはプロパティDataContext経由で接続タイムアウトを設定します。タイムアウトになると、 が表示され、クエリはキャンセルされます。CommandTimeoutTimeoutException

タイムアウトが発生した瞬間にサーバーでクエリがキャンセルされるとは限りませんが、ほとんどの場合、クエリはすぐにキャンセルされます。詳細については、優れた記事「There's no such thing as a query timeout...」を参照してください。そこからの重要な部分は次のとおりです。

クライアントはアテンション イベントを使用してサーバーにクエリ タイムアウトを通知します。アテンション イベントは、SQL Server クライアントが送信できる TDS パケットの種類にすぎません。接続/切断、T-SQL バッチ、および RPC イベントに加えて、クライアントはサーバーに注意を通知できます。アテンションは、接続の現在実行中のクエリ (存在する場合) をできるだけ早くキャンセルするようにサーバーに指示します。アテンションは、開いているトランザクションをロールバックせず、現在実行中のクエリを即座に停止しません。サーバーは、次の利用可能な機会に、接続に対して行っていたことを中止します。通常、これはすぐに発生しますが、常にではありません。

ただし、プロバイダーごとに異なり、サーバーのバージョン間で変更される可能性があることを忘れないでください.

于 2012-09-11T20:03:16.867 に答える
0

バックグラウンド スレッドでクエリを実行すると、簡単に実行できます。メイン スレッドでタイマーを開始し、クエリを実行するバックグラウンド スレッドを生成します。20 秒が経過してもバックグラウンド スレッドが結果を返さない場合、メイン スレッドはそれをキャンセルできます。

于 2012-09-11T20:03:32.730 に答える