Очень медленный запрос в коде, но быстрый в SSMS

У меня довольно простой запрос, у меня постоянно возникают таймауты (на выполнение требуется более трех минут, я остановил его раньше, поэтому я может опубликовать этот вопрос), когда он выполняется в коде, однако, когда я запускаю тот же запрос с того же компьютера в Sql Server Management Studio, запрос будет принимать только 2532 мс первый запрос, когда данные не кэшируется на сервере и 524 мс для повторных запросов.

Вот мой код на 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 строк , а es_history_dt содержит 8588493 строк . Обе таблицы хорошо проиндексированы, и в плане выполнения в SSMS говорится, что они используют поиск по индексу для поиска, поэтому поиск выполняется быстро. Программа ведет себя так, как будто она не использует индексы для версии запроса C #.

17
задан Scott Chamberlain 3 October 2011 в 17:03
поделиться