ホームページ > データベース > mysql チュートリアル > EF 6 動的クエリでのパラメーター スニッフィングを回避するにはどうすればよいですか?

EF 6 動的クエリでのパラメーター スニッフィングを回避するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-23 20:22:13
オリジナル
438 人が閲覧しました

How Can I Avoid Parameter Sniffing in EF 6 Dynamic Queries?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート