Share via


クエリ プランのキャッシュ (Entity SQL)

クエリの実行が試行されると、クエリ パイプラインではそのクエリ プランのキャッシュを検索し、同じクエリが既にコンパイルされ使用可能になっているかどうかを確認します。 使用可能になっている場合は、新しいクエリを構築する代わりに、キャッシュされたプランを再利用します。 クエリ プランのキャッシュ内に一致するものが見つからない場合は、クエリがコンパイルされ、キャッシュされます。 クエリはその Entity SQL テキストとパラメーターのコレクション (名前と型) によって識別されます。 テキストの比較では、常に大文字と小文字が区別されます。

構成

クエリ プランのキャッシュは EntityCommand を使用して構成できます。

EntityCommand.EnablePlanCaching でクエリ プランのキャッシュを有効または無効にするには、このプロパティを true または false に設定します。 2 回以上使用する予定がない個別の動的クエリ プランのキャッシュを無効にすると、パフォーマンスが向上します。

EnablePlanCaching を使用してクエリ プランのキャッシュを有効にできます。

一般的に、動的クエリは避けてください。 次の動的クエリ例は、検証を行わずにユーザー入力をそのまま受け入れるので、SQL インジェクション攻撃に対して脆弱です。

var query = "SELECT sp.SalesYTD FROM AdventureWorksEntities.SalesPerson as sp WHERE sp.EmployeeID = " + employeeTextBox.Text;

動的に生成されたクエリを使用する場合は、再利用される可能性の低いキャッシュ エントリのためにメモリが不必要に消費されないように、クエリ プランのキャッシュを無効にすることをお勧めします。

静的クエリおよびパラメーター化クエリに対してクエリ プランをキャッシュすると、パフォーマンスが向上します。 以下は、静的クエリの例です。

var query = "SELECT sp.SalesYTD FROM AdventureWorksEntities.SalesPerson as sp";

クエリ プランのキャッシュでクエリを適切に一致させるには、次の要件に従う必要があります。

  • クエリ テキストは定数パターンにする必要があり、最も望ましいのは定数文字列またはリソースです。

  • ユーザーが指定した値を渡す必要があるときは、EntityParameter または ObjectParameter を使用します。

クエリ プランのキャッシュ内のスロットを必要以上に消費する次のようなクエリ パターンは避けます。

  • テキストの大文字または小文字の変更

  • 空白への変更

  • リテラル値への変更

  • コメント内のテキストの変更

関連項目