Быстро в SSMS и медленно в приложении - Почему этот DataSet так долго заполняется?
У меня есть набор данных, который заполняется из запроса следующим образом ...
SELECT DISTINCT ColA, ColB, ColC, ColD, ColE, ColF, dbo.CustomFunction(ColA) AS ColG
FROM TableA
JOIN ViewA ON ColA = ViewColA
WHERE ColB = @P1 AND ColC = @P2 AND ColD = @P3 AND ColE = @P4
ORDER BY ColB, ColC DESC, ColA
(Запрашиваемые поля и т. Д.)
Я профилировал этот запрос, и он возвращает около 200 строк за 12 секунд, работающих в SSMS. Обратите внимание, что я перезапустил сервер и использовал необходимые команды DBCC, чтобы гарантировать, что существующий план выполнения не использовался.
Однако, когда я запускаю этот запрос из своего приложения .Net, для заполнения набора данных требуется более 30 секунд, и время ожидания по умолчанию для команды ADO.Net по умолчанию составляет 30 секунд.
Если запрос выполняется за 12 секунд, я просто не могу понять, почему для заполнения 200 строк в наборе данных требуется больше 18 секунд. Если здесь не происходит что-то, о чем я не знаю. Я представляю, что ADO.Net просто вызывает запрос, получает данные и заполняет их.
Код заполнения выглядит следующим образом (заметьте, я унаследовал это от другого разработчика) ...
DataSet res = new DataSet();
try
{
using (SqlDataAdapter da = new SqlClient.SqlDataAdapter())
{
var cmd = new Sq,lClient.SqlCommand();
String params = FillParameters(cmd, _params, params);
cmd.CommandText = params + SQL;
cmd.Connection = conn;
cmd.Transaction = _transaction;
if (CommandTimeout.HasValue)
{
cmd.CommandTimeout = CommandTimeout.Value;
}
da.SelectCommand = cmd;
da.Fill(res);
return res;
}
}
catch
{
throw;
}
Выполнение этого в отладке, когда метод заливки активирован, метод занимает около 50 секунд. Это подтверждается установкой высокого времени ожидания в команде ADO.Net. Я доволен производительностью запроса, который я могу выполнить последовательно примерно за 12 секунд, так почему же дополнительные 18 с лишним секунд для заполнения набора данных?
Делает ли ADO.Net что-то (возможно, из-за структуры) этого кода, что означает, что для заполнения набора данных требуется более 18 секунд? Я попытался установить EnforceConstraints в false, и это не имеет значения.
Стоит отметить, что благодаря дизайну этой программы в команду sql подается больше необходимого количества параметров. Метод FillParameters делает это. Есть около 20 параметров «по умолчанию», которые добавляются в команду, но только, например. 4 используются этим запросом.
Итак, в итоге,
Что может случиться, чтобы заполнить DS больше 18 секунд?
Делает ли ADO.Net что-то «умное» с моим набором данных, а не просто выполняет запрос и заполняет набор данных?
Может ли это быть чрезмерное количество параметров, переданных, что вызывает проблему.
Благодарю.