ホームページ >データベース >mysql チュートリアル >EF 6 インターセプトは、パラメーター スニッフィングによって引き起こされる永続的なクエリ タイムアウトをどのように解決できますか?

EF 6 インターセプトは、パラメーター スニッフィングによって引き起こされる永続的なクエリ タイムアウトをどのように解決できますか?

DDD
DDDオリジナル
2024-12-25 05:07:14966ブラウズ

How Can EF 6 Interception Solve Persistent Query Timeouts Caused by Parameter Sniffing?

EF 6 パラメーター スニッフィング ソリューション: クエリ タイムアウトの克服

LINQ to Entities クエリによって生成された SQL の効率にもかかわらず、その実行はEF 6 では永続的なクエリ タイムアウトが発生します。これは、データベース エンジンで使用されるパフォーマンス最適化手法であるパラメーター スニッフィングが原因である可能性があります。ただし、単純に「OPTION RECOMPILE」コマンドを EF クエリに直接追加することはできません。

解決策: EF インターセプトを利用する

EF 6 は、次のようなインターセプト機能を提供します。 SQL コマンドをデータベース上で実行する前に操作できます。カスタム DbCommandInterceptor を実装すると、「OPTION RECOMPILE」などのクエリ ヒントを内部コマンドに追加できます。

このようなインターセプターの実装は次のとおりです。

public class OptionRecompileHintDbCommandInterceptor : IDbCommandInterceptor
{
    public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
    {
        addQueryHint(command);
    }

    public void ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> 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) &amp;&amp; !command.CommandText.Contains("option(recompile)"))
        {
            command.CommandText = command.CommandText + " option(recompile)";
        }
    }
}

このインターセプターを使用するには、次の行をアプリケーションの先頭に追加するだけです:

DbInterception.Add(new OptionRecompileHintDbCommandInterceptor());

これにより、 EF で生成されたすべての SQL コマンドには「OPTION RECOMPILE」ヒントが追加され、パラメーター スニッフィングを防止し、クエリのパフォーマンスを向上させます。

以上がEF 6 インターセプトは、パラメーター スニッフィングによって引き起こされる永続的なクエリ タイムアウトをどのように解決できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。