私のc#アプリケーションでは、ユーザーはSQLデータベースから動的レポートを作成できます。DBクエリが複雑すぎて実行に時間がかかりすぎる場合は、ユーザーに警告する必要があります。
私はmicrosoft-sql-server2008を使用しています。
どうやってやるの?クエリ実行の実行時間を計算するための統計アルゴリズムはありますか?
私のc#アプリケーションでは、ユーザーはSQLデータベースから動的レポートを作成できます。DBクエリが複雑すぎて実行に時間がかかりすぎる場合は、ユーザーに警告する必要があります。
私はmicrosoft-sql-server2008を使用しています。
どうやってやるの?クエリ実行の実行時間を計算するための統計アルゴリズムはありますか?
これは事実上不可能です。データベースは、テーブルとインデックスの統計に基づいて実行計画を計算しますが、データベース自体でさえ実行時間を予測できません。
順序付け (および順序付けを意味するグループ化) やいくつかの結合などの兆候があるかもしれませんが、私の意見では、アルゴリズムによる予測はほとんど不可能です。
他の人が指摘しているように、絶対的な答えは、クエリの実行にかかる時間を前もって知ることはできないということです。
私が提案できる最も近いことは、クエリを実行する前にクエリに何が含まれているかを大まかに把握することです。まず、クエリの推定実行プランを取得し、その大まかな分析を行います。
SET SHOWPLAN_XML ON
GO
SELECT TOP 100 *
FROM MyTable
GO
実行プランのXMLには、推定行数、実行プランを選択する前にオプティマイザーがタイムアウトしたかどうか、実行される操作(インデックスシーク/スキャンなど)、その他の情報が含まれています(実際には実行計画をさらに深く掘り下げる必要があります)。
したがって、理論的には、計画内の情報を調べて、大雑把な/最良の推測の判断を下すことができます。これは推定実行計画にすぎないことに注意してください。どのレベルの精度/判断を下せるかはわかりません。
それはあなたに時間を与えません、ただ(多分)クエリの相対的な予想されるコストを比較検討するための何らかの方法です
結合の数とタイプ、順序付け、場所の条件などの要因だけでなく、影響を受けるすべてのテーブルの行数にも基づいて、式を作成できます。
その式がどのように構築されているかに応じて、クエリが「重い」状態になったときに大まかな目安が得られます。
他の人がすでに示したように、事前に複雑さを予測することはできません。できることは、クエリを実行させ、時間がかかりすぎる場合は中止することだけです。
しばらくしてからクエリを中止するには、SqlCommand.CommandTimeout プロパティを調べて、適切な値に設定します。このアプローチの欠点は、クエリに時間がかかりすぎたというエラー メッセージを表示するためだけに、ユーザーが完全に待機する可能性があることです。
もう 1 つのアプローチは、ユーザーに時間がかかるタイミングを決定させることです。これは、制限なし (タイムアウト = 0) を使用して実行できますが、execute メソッドを非同期で呼び出し、ユーザーがヒットできるキャンセル ボタンをユーザーに提供するだけです。
この最後のアプローチは、SQL Server Management Studio 内と同じです。クエリを開始すると、現在クエリが実行されている時間を示す実行中のタイマーがフッターに表示され、ツールバーには現在実行中のクエリを停止するためのキャンセル ボタンがあります。