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
Libérer: 2024-12-23 20:22:13
original
457 Les gens l'ont consulté

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

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

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

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!

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal