0

ADO.Net を使用して SQL Server 2008 R2 に接続し、アドホック パラメーター化クエリを使用してデータを取得するデスクトップ アプリケーションがある場合、アプリの 2 つの異なるインスタンスがクエリを実行するとどうなりますか? 最初の呼び出しはコンパイルされ、2 番目の呼び出しはメモリ内バージョンを使用しますか?

クエリの例:

SqlConnection conn = new SqlConnection(_connectionString);
conn.Open();
string s = "SELECT email, passwd, login_id, full_name " + 
  "FROM members WHERE email = @email";
SqlCommand cmd = new SqlCommand(s);
cmd.Parameters.Add("@email", email);
SqlDataReader reader = cmd.ExecuteReader();

クエリが初めて起動されたときにクエリのパフォーマンスが低下していることに気付き、連続した呼び出しは問題ないように見えます。これがアプリの各インスタンスの全体的な動作なのか、それとも 1 つのインスタンスから初めてクエリが起動されたときに、このクエリを使用するアプリのすべてのインスタンスのパフォーマンスが向上するのか疑問に思っています。

4

3 に答える 3

2

SQL Server は、最初にクエリを取得したときにクエリを分析し、適度にパフォーマンスの高い実行プランを見つける必要があります。

それが完了したら、クエリ

SELECT email, passwd, login_id, full_name FROM members WHERE email = @email

およびその実行プランはプラン キャッシュに格納されます。

プラン キャッシュに十分なスペースがある限り、まったく同じクエリ (最後のカンマ、スペースなどに至るまで "同じ" です!完全に同じSQL でなければなりません) を実行すると、プラン キャッシュからその実行プランが再利用されます。 .

そうです - そのクエリが最初に実行されるとき (たとえば、SQL Server の再起動後) には、わずかな遅延が目立ちますが、クエリが実行されてクエリ プランがキャッシュされると、パフォーマンスが大幅に向上するはずです。まったく同じクエリを使用する SQL Server。

まったく同じクエリの要件は、パフォーマンスの観点からも、SQL を自分でつなぎ合わせてクエリ値を実際のクエリ テキストに入れることが非常に悪い理由を示しています。そのようにして、新しい値を持つ各クエリは新しいSQL クエリ テキストとストーリー全体を、リクエストごとに繰り返す必要があります。あなたのようにパラメータ化されたクエリを使用している場合、クエリは同じままであるため、キャッシュされた実行プランを再利用できます-パラメータ値のみが変更されますが、クエリ実行プランとキャッシュされた実行プランを再利用する機能には影響しません予定

于 2013-06-25T04:58:46.033 に答える