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