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
Barbara Streisandoriginal
2025-01-05 14:59:42926parcourir

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.
    }
}

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

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;

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!

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