Тайм-аут SP адаптера данных.NET

У нас есть хранимая процедура SQL Server, которая прекрасно работает в SQL Manager напрямую, выполняет довольно большие вычисления, но для ее выполнения требуется не более 50-10 секунд.

Однако, когда мы вызываем это из приложения.NET через адаптер данных, время ожидания истекает. Тайм-аут, однако, происходит раньше, чем период тайм-аута, мы устанавливаем его равным 60 секундам, и он все еще истекает примерно через 20 секунд или меньше.

Я гуглил проблему и видел, как другие замечают проблемы, когда SP работает fien напрямую, но медленно через вызов adpater для данных.

Любые идеи о том, как решить эту проблему?

3 ответа

Изменить свойство timeout объекта SqlConnection

Когда вы говорите, что он работает нормально в SSMS напрямую, вы имеете в виду, что выполнение хранимой процедуры само по себе работает нормально, или что базовый SQL работает нормально?

Из вашего описания это звучит как пример сниффинга параметров. По сути, SQL Server кэшировал план выполнения, который является оптимальным для одного набора параметров, но исключительно плохим для большинства других.

Вы можете использовать опцию RECOMPILE для запроса в вашей хранимой процедуре, чтобы принудительно перекомпилировать при каждом выполнении. Если это не вызывается часто или компиляция не занимает много времени, вы можете использовать этот трюк.

Другое решение - скопировать параметры хранимой процедуры в локальные переменные и использовать их в запросе. Пример:

CREATE PROCEDURE my_proc
  @var1 INT
AS
  DECLARE @_var1 AS INT;
  SET @_var1 = @var1;

  SELECT col1, col2, col3
    FROM t1
   WHERE t1.pk = @_var1;

Убедитесь, что вы проверили все свои тайм-ауты. Я не знаю, используете ли вы asp.net или winforms, но по крайней мере первые два из этого списка будут применяться:
Время ожидания не истекло, но время ожидания все еще истекло (см. Код)?

Еще одна вещь, которую нужно проверить, это то, что вы правильно настраиваете свои параметры. Неправильное поведение может нарушить индексы. Я видел это, когда у вас есть индекс для столбца varchar, который является ключом к вашему запросу, и вы устанавливаете свой параметр для этого столбца, используя простую функцию AddWithValue() или другую функцию, которая явно не устанавливает тип. .Net даст вам параметр nvarchar по умолчанию, потому что строки в.Net являются Unicode. В результате он не сможет использовать индекс.

Другие вопросы по тегам