EF 6 パラメーター スニッフィング
EF 6 で大規模な動的クエリを操作する場合、パラメーター スニッフィングが原因でパフォーマンスの問題が発生する可能性があります。これは、パラメーターが変更された場合でも、データベース エンジンが特定のパラメーター セットを含むクエリの実行プランを保持し、それを後続の実行に適用する場合に発生します。
この問題に対処するために、EF 6 はインターセプト機能を提供します。これにより、SQL コマンドを実行前に操作できるようになります。これにより、「OPTION RECOMPILE」などのオプションをコマンドに埋め込むことができます。
この機能を利用するには、[IDbCommandInterceptor](https://docs.microsoft.com/en-us/dotnet/api) /entityframework/system.data.entity.infrastructor.idbcommandinterceptor?view=ef6) インターフェイスをオーバーライドします。 [ReaderExecuting](https://docs.microsoft.com/en-us/dotnet/api/entityframework/system.data.entity.infrastructor.idbcommandinterceptor.readerexecuting?view=ef6) メソッド。このメソッドでは、必要なクエリ ヒントをコマンドに追加できます。
クエリを選択するための「OPTION RECOMPILE」ヒントを追加するインターセプターの実装例を次に示します。
public class OptionRecompileHintDbCommandInterceptor : IDbCommandInterceptor { public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext) { addQueryHint(command); } private static void addQueryHint(IDbCommand command) { if (command.CommandType != CommandType.Text || !(command is SqlCommand)) return; if (command.CommandText.StartsWith("select", StringComparison.OrdinalIgnoreCase) && !command.CommandText.Contains("option(recompile)")) { command.CommandText = command.CommandText + " option(recompile)"; } } }
インターセプタを使用するには、アプリケーションの先頭に次の行を追加します:
DbInterception.Add(new OptionRecompileHintDbCommandInterceptor());
これにより、「OPTION」が確実に実行されます。 RECOMPILE" ヒントが EF 6 を通じて実行されるすべての選択クエリに追加され、パラメーター スニッフィングの影響が軽減されます。
以上がEF 6 パラメーター スニッフィングのパフォーマンスの問題を防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。