Maison > base de données > tutoriel mysql > Pourquoi ma requête SQL est-elle 3 minutes plus lente en C# qu'en SSMS ?

Pourquoi ma requête SQL est-elle 3 minutes plus lente en C# qu'en SSMS ?

Mary-Kate Olsen
Libérer: 2024-12-31 07:43:10
original
861 Les gens l'ont consulté

Why is My SQL Query 3 Minutes Slower in C# Than in SSMS?

Écart de performances des requêtes entre le code et SSMS

Un développeur a rencontré une différence de performances significative lors de l'exécution de la même requête dans le code C# et dans la gestion de SQL Server Studio (SSMS). Alors que la requête s'est terminée en moins de 3 secondes dans SSMS, elle a pris plus de 3 minutes lorsqu'elle est exécutée dans l'application.

Cause première du problème de performances

Après un examen plus approfondi, le problème a été identifié comme étant une différence subtile entre les paramètres de requête utilisés dans le code C# et SSMS. Dans le code C#, le paramètre de l'ID client a été transmis en tant que type NVARCHAR, tandis que dans la requête SSMS, il a été déclaré en tant que type VARCHAR.

Impact de priorité du type de données

En raison des règles de priorité des types de données, le paramètre NVARCHAR dans la requête C# a empêché la requête d'exploiter une recherche d'index. Cela a entraîné une analyse de la table, augmentant considérablement le temps d'exécution. En revanche, le paramètre VARCHAR dans la requête SSMS permettait à l'optimiseur de requête d'utiliser une recherche d'index, ce qui entraînait une exécution plus rapide.

Solution au problème de performances

Pour résoudre le problème écart de performances, le développeur avait deux options :

  • Option 1 : Utiliser le paramètre avec spécifié Type

    En utilisant le constructeur qui accepte un type, le développeur a explicitement défini le paramètre comme un type VARCHAR :

    Parameters.Add("@clientID", SqlDbType.Varchar, 200)
    Copier après la connexion

    Cela garantit que le paramètre est transmis comme le type correct et n'interfère pas avec la capacité SARG de la requête.

  • Option 2 : paramètre de conversion en SQL Requête

    Alternativement, le développeur peut convertir le paramètre dans la requête SQL comme suit :

    where client_id = cast(@clientID as varchar(200))
    Copier après la connexion

    Cette méthode résout également le problème de type et permet à la requête d'exploiter la recherche d'index .

Supplémentaire Recommandations

  • Utiliser la longueur du paramètre explicite : Pour éviter la pollution du cache, il est conseillé au développeur de spécifier explicitement la longueur du paramètre VARCHAR lors de l'utilisation de l'option 1.
  • Article de référence recommandé : Le développeur est encouragé à se référer à l'article « Lent dans l'application, rapide dans SSMS ? Comprendre les mystères des performances" pour plus d'informations sur les écarts de performances entre le code et SSMS.

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