Maison >base de données >tutoriel mysql >Comment l'interception EF 6 peut-elle résoudre les délais d'attente persistants des requêtes causés par le reniflage des paramètres ?

Comment l'interception EF 6 peut-elle résoudre les délais d'attente persistants des requêtes causés par le reniflage des paramètres ?

DDD
DDDoriginal
2024-12-25 05:07:14966parcourir

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

Solution de reniflage de paramètres EF 6 : surmonter le délai d'attente des requêtes

Malgré l'efficacité du SQL généré par votre requête LINQ to Entities, son exécution via EF 6 entraîne un délai d’attente de requête persistant. Cela est probablement dû au reniflage de paramètres, une technique d'optimisation des performances utilisée par le moteur de base de données. Mais vous ne pouvez pas simplement ajouter une commande "OPTION RECOMPILE" directement à votre requête EF.

Solution : Utiliser l'interception EF

EF 6 offre une fonctionnalité d'interception qui permet vous de manipuler les commandes SQL avant qu'elles ne s'exécutent sur la base de données. En implémentant un DbCommandInterceptor personnalisé, vous pouvez ajouter des indicateurs de requête, notamment « OPTION RECOMPILE », aux commandes internes.

Voici l'implémentation d'un tel intercepteur :

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)";
        }
    }
}

Pour utiliser cet intercepteur , ajoutez simplement la ligne suivante au début de votre candidature :

DbInterception.Add(new OptionRecompileHintDbCommandInterceptor());

Cela garantira que tous Les commandes SQL générées par EF sont accompagnées de l'indication "OPTION RECOMPILE", empêchant le reniflage des paramètres et améliorant les performances des requêtes.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn