У меня довольно простой запрос, который я получаю по таймаутам (это занимает более трех минут, я остановил его раньше, чтобы я мог опубликовать этот вопрос), когда он выполняется в коде, однако когда я выполняю тот же запрос изна том же компьютере в Sql Server Management Studio запрос будет принимать только 2532 ms
первый запрос, когда данные не кэшируются на сервере, и 524 ms
для повторных запросов.
Вот мой код c #
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.
}
вот мой код, который я запускаю в SSMS, я вытащил его прямо из 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
Что вызывает существенное расхождение во времени?
Чтобы сохранить раздел комментариев чистым, я отвечу на некоторые часто задаваемые вопросы здесь.
Один и тот же компьютер и вход в систему используются как для приложения, так и для ssms.
Только 15 строквернулся в моем примере запроса.Однако es_history
содержит 11351699 rows
, а es_history_dt
содержит 8588493 rows
.Обе таблицы хорошо проиндексированы, и план выполнения в SSMS говорит, что они используют поиск индекса для поиска, поэтому они являются быстрым поиском.Программа ведет себя так, как будто она не использует индексы для версии запроса на C #.