J'ai une requête assez simple que je continue à obtenir des délais (il faut plus de trois minutes pour terminer, je l'ai arrêté tôt pour que je puisse poster cette question) sur lorsqu'il s'exécute dans le code Cependant, lorsque j'exécute la même requête à partir du même ordinateur dans Sql Server Management Studio, la requête ne prend que 2532 ms
la première requête lorsque les données ne sont pas mises en cache sur le serveur et 524 ms
pour les requêtes répétées.Requête extrêmement lente dans le code mais rapide dans SSMS
Voici mon C# Code
using (var conn = new SqlConnection("Data Source=backend.example.com;Connect Timeout=5;Initial Catalog=Logs;Persist Security Info=True;User ID=backendAPI;Password=Redacted"))
using (var ada = new SqlDataAdapter(String.Format(@"
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 {0}) {1}
Order by dt desc"
, where.ToString(), (cbShowOnlyFailed.Checked ? "and Status = 1" : "")), conn))
{
ada.SelectCommand.Parameters.AddWithValue("@clientID", ClientID);
ada.SelectCommand.Parameters.AddWithValue("@dt", dtpFilter.Value);
//ada.SelectCommand.CommandTimeout = 60;
conn.Open();
Logs.Clear();
ada.Fill(Logs); //Time out exception for 30 sec limit.
}
voici mon code que je courais dans SSMS, je tire à droite de ada.SelectCommand.CommandText
declare @clientID varchar(200)
set @clientID = '138'
declare @dt datetime
set @dt = '9/19/2011 12:00:00 AM'
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
Quelle est l'origine de l'inconsistance majeure pour la différence de temps?
Pour garder la section des commentaires propre, je vais répondre à quelques questions ici.
Le même ordinateur et la même connexion sont utilisés à la fois pour l'application et pour les ssms.
Seulement 15 lignes sont retournées dans mon exemple de requête. Cependant, es_history
contient 11351699 rows
et es_history_dt
contient 8588493 rows
. Les deux tables sont bien indexées et le plan d'exécution dans SSMS indique qu'elles utilisent des recherches d'index pour les recherches, ce qui en fait des recherches rapides. Le programme se comporte comme s'il n'utilisait pas les index pour la version C# de la requête.
Avez-vous utilisé le même utilisateur dans SSMS que dans le code? – bzlm
Combien de lignes sont renvoyées par cette requête? –
@hugh s'il vous plaît voir ma mise à jour .. –