EF 6 でのパラメーター スニッフィング
Entity Framework 6 (EF 6) で大規模な動的クエリを処理する場合、パフォーマンスの問題が発生する可能性がありますパラメータスニッフィングが原因です。これは、EF 6 が渡された初期パラメータに基づいてクエリの実行プランをキャッシュするときに発生します。その結果、パラメータが変更されたときに実行が非効率になります。
パラメータ スニッフィングに対処する 1 つの解決策は、「OPTION RECOMPILE」などのオプションを埋め込むことです。 SQLコマンドに入力します。これは、クエリが実行されるたびに実行プランを再コンパイルするようにデータベースに示唆します。ただし、EF 6 は、そのようなオプションの追加をネイティブにサポートしていません。
解決策: EF インターセプト機能
EF 6 は、内部 SQL コマンドを操作できるインターセプト機能を提供します。処刑される前に。これにより、「OPTION RECOMPILE」などのオプションを動的に埋め込むことができます。
この機能を利用するには、カスタム IDbCommandInterceptor クラスを作成できます。例:
public class OptionRecompileHintDbCommandInterceptor : IDbCommandInterceptor { // Add "OPTION RECOMPILE" hint to SQL commands before execution 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());
このソリューションを実装すると、パラメータ スニッフィングを効果的に回避でき、 EF 6 での動的クエリのパフォーマンスを向上させます。
以上がEF 6 動的クエリでのパラメーター スニッフィングを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。