Heim > Datenbank > MySQL-Tutorial > Wie kann EF 6 Interception dauerhafte Abfrage-Timeouts lösen, die durch Parameter-Sniffing verursacht werden?

Wie kann EF 6 Interception dauerhafte Abfrage-Timeouts lösen, die durch Parameter-Sniffing verursacht werden?

DDD
Freigeben: 2024-12-25 05:07:14
Original
966 Leute haben es durchsucht

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

EF 6-Parameter-Sniffing-Lösung: Überwindung des Abfrage-Timeouts

Trotz der Effizienz des von Ihrer LINQ to Entities-Abfrage generierten SQL ist seine Ausführung durch Bei EF 6 kommt es zu einem dauerhaften Abfrage-Timeout. Dies ist wahrscheinlich auf Parameter-Sniffing zurückzuführen, eine Technik zur Leistungsoptimierung, die von der Datenbank-Engine verwendet wird. Sie können jedoch nicht einfach einen „OPTION RECOMPILE“-Befehl direkt zu Ihrer EF-Abfrage hinzufügen.

Lösung: EF Interception nutzen

EF 6 bietet eine Abfangfunktion, die dies ermöglicht Sie können SQL-Befehle manipulieren, bevor sie in der Datenbank ausgeführt werden. Durch die Implementierung eines benutzerdefinierten DbCommandInterceptors können Sie Abfragehinweise, einschließlich „OPTION RECOMPILE“, zu den internen Befehlen hinzufügen.

Hier ist die Implementierung eines solchen Interceptors:

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)";
        }
    }
}
Nach dem Login kopieren

So verwenden Sie diesen Interceptor , fügen Sie einfach die folgende Zeile am Anfang Ihrer Bewerbung ein:

DbInterception.Add(new OptionRecompileHintDbCommandInterceptor());
Nach dem Login kopieren

Damit wird sichergestellt, dass alles An EF-generierte SQL-Befehle wird der Hinweis „OPTION RECOMPILE“ angehängt, der Parameter-Sniffing verhindert und die Abfrageleistung verbessert.

Das obige ist der detaillierte Inhalt vonWie kann EF 6 Interception dauerhafte Abfrage-Timeouts lösen, die durch Parameter-Sniffing verursacht werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage