Maison > base de données > tutoriel mysql > Pourquoi ma requête SQL Server est-elle rapide dans SSMS mais lente dans le code C# ?

Pourquoi ma requête SQL Server est-elle rapide dans SSMS mais lente dans le code C# ?

Barbara Streisand
Libérer: 2025-01-05 14:59:42
original
959 Les gens l'ont consulté

Why is My SQL Server Query Fast in SSMS but Slow in C# Code?

Différence de performances des requêtes dans le code par rapport à SSMS

Une requête qui s'exécute correctement dans SQL Server Management Studio (SSMS) peut présenter une lenteur excessive lorsque exécuté dans le code. Cette divergence, rencontrée lors d'un récent développement de code, a donné lieu à une enquête sur la cause sous-jacente.

Implémentation du code

Le code C# utilisé pour exécuter la requête est le suivant :

using (var conn = new SqlConnection("Data Source=backend.example.com;..."))
{
    using (var ada = new SqlDataAdapter(sqlCommand, conn))
    {
        ada.SelectCommand.Parameters.AddWithValue("@clientID", ClientID);
        ada.SelectCommand.Parameters.AddWithValue("@dt", dtpFilter.Value);
        conn.Open();
        Logs.Clear();
        ada.Fill(Logs); // Time out exception for 30 sec limit.
    }
}
Copier après la connexion

Requête SSMS

La requête identique, extraite du Le code C#, est exécuté directement dans SSMS :

SELECT [PK_JOB],[CLIENT_ID],[STATUS],[LOG_NAME],dt 
FROM [ES_HISTORY] 
inner join [es_history_dt] on [PK_JOB] = [es_historyid] 
Where client_id = @clientID and dt > @dt and (job_type > 4 or job_type = 0 or job_type = 1 or job_type = 4 ) 
Order by dt desc
Copier après la connexion

Analyse

Après examen, une différence subtile existe entre les deux requêtes. Dans la version SSMS, le paramètre @clientID est déclaré comme VARCHAR, tandis que dans le code C#, il est ajouté à l'aide de la méthode AddWithValue, qui attribue généralement le type de données en fonction du type de la variable .NET. Dans ce cas, la variable ClientID est de type chaîne, qui est mappée à NVARCHAR dans SQL Server.

Impact

Cette différence a un impact significatif sur les performances des requêtes. Le type de paramètre NVARCHAR ne permet pas le filtrage des arguments de recherche (SARG), une technique d'optimisation cruciale utilisée par SQL Server pour localiser rapidement les lignes en fonction des colonnes indexées. En conséquence, la requête dans le code C# est obligée d'effectuer une analyse de table, ce qui est bien moins efficace qu'une recherche d'index.

Solution

Pour résoudre le En cas de divergence, il est nécessaire de spécifier explicitement le type de données VARCHAR pour le paramètre @clientID dans le code C#. Ceci peut être réalisé en utilisant la syntaxe suivante :

ada.SelectCommand.Parameters.Add("@clientID", SqlDbType.VarChar, 200).Value = ClientID;
Copier après la connexion

En garantissant que les types de données des paramètres correspondent à ceux déclarés dans la requête SSMS, l'application peut éviter la pénalité de performances et exécuter la requête dans un délai raisonnable. de manière efficace.

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