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) && !command.CommandText.Contains("option(recompile)")) { command.CommandText = command.CommandText + " option(recompile)"; } } }
So verwenden Sie diesen Interceptor , fügen Sie einfach die folgende Zeile am Anfang Ihrer Bewerbung ein:
DbInterception.Add(new OptionRecompileHintDbCommandInterceptor());
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!