Heim > Datenbank > MySQL-Tutorial > Wie kann ich Parameter-Sniffing in dynamischen EF 6-Abfragen vermeiden?

Wie kann ich Parameter-Sniffing in dynamischen EF 6-Abfragen vermeiden?

Linda Hamilton
Freigeben: 2024-12-23 20:22:13
Original
438 Leute haben es durchsucht

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

Parameter-Sniffing in EF 6

Beim Umgang mit großen dynamischen Abfragen in Entity Framework 6 (EF 6) können Leistungsprobleme auftreten aufgrund von Parameter-Sniffing. Dies tritt auf, wenn EF 6 den Ausführungsplan einer Abfrage basierend auf den ursprünglich übergebenen Parametern zwischenspeichert, was zu einer ineffizienten Ausführung führt, wenn sich die Parameter ändern.

Eine Lösung zur Bekämpfung des Parameter-Sniffings besteht darin, Optionen wie „OPTION RECOMPILE“ einzubetten. in den SQL-Befehl ein. Dies weist die Datenbank darauf hin, den Ausführungsplan jedes Mal neu zu kompilieren, wenn die Abfrage ausgeführt wird. Allerdings unterstützt EF 6 das Hinzufügen solcher Optionen nicht nativ.

Lösung: EF-Abfangfunktion

EF 6 bietet eine Abfangfunktion, mit der Sie seine internen SQL-Befehle manipulieren können bevor sie hingerichtet werden. Dadurch können Sie Optionen wie „OPTION RECOMPILE“ dynamisch einbetten.

Um diese Funktion zu nutzen, können Sie eine benutzerdefinierte IDbCommandInterceptor-Klasse erstellen. Zum Beispiel:

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

Um diesen Interceptor zu verwenden, fügen Sie einfach die folgende Zeile am Anfang Ihrer Anwendung hinzu:

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

Durch die Implementierung dieser Lösung können Sie Parameter-Sniffing effektiv vermeiden und Verbessern Sie die Leistung Ihrer dynamischen Abfragen in EF 6.

Das obige ist der detaillierte Inhalt vonWie kann ich Parameter-Sniffing in dynamischen EF 6-Abfragen vermeiden?. 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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage