Maison >base de données >tutoriel mysql >Comment puis-je éviter le reniflage de paramètres dans les requêtes dynamiques EF 6 ?

Comment puis-je éviter le reniflage de paramètres dans les requêtes dynamiques EF 6 ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-23 20:22:13456parcourir

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

Renifleur de paramètres dans EF 6

Lors du traitement de requêtes dynamiques volumineuses dans Entity Framework 6 (EF 6), il est possible de rencontrer des problèmes de performances en raison du reniflage des paramètres. Cela se produit lorsque EF 6 met en cache le plan d'exécution d'une requête en fonction des paramètres initiaux transmis, ce qui entraîne une exécution inefficace lorsque les paramètres changent.

Une solution pour résoudre le problème du reniflage des paramètres consiste à intégrer des options telles que "OPTION RECOMPILE". dans la commande SQL. Cela indique à la base de données de recompiler le plan d'exécution à chaque fois que la requête est exécutée. Cependant, EF 6 ne prend pas en charge nativement l'ajout de telles options.

Solution : fonctionnalité d'interception EF

EF 6 fournit une fonctionnalité d'interception qui vous permet de manipuler ses commandes SQL internes. avant qu'ils ne soient exécutés. Cela vous permet d'intégrer dynamiquement des options telles que "OPTION RECOMPILE".

Pour utiliser cette fonctionnalité, vous pouvez créer une classe IDbCommandInterceptor personnalisée. Par exemple :

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

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

DbInterception.Add(new OptionRecompileHintDbCommandInterceptor());

En implémentant cette solution, vous pouvez efficacement éviter le reniflage de paramètres et améliorez les performances de vos requêtes dynamiques dans EF 6.

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