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
Libérer: 2024-12-25 05:07:14
original
960 Les gens l'ont consulté

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)";
        }
    }
}
Copier après la connexion

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

DbInterception.Add(new OptionRecompileHintDbCommandInterceptor());
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal