Быстро в 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 что-то «умное» с моим набором данных, а не просто выполняет запрос и заполняет набор данных?

Может ли это быть чрезмерное количество параметров, переданных, что вызывает проблему.

Благодарю.

Ответы на вопрос(4)

Ваш ответ на вопрос