Тайм-аут SP адаптера данных .NET - PullRequest
0 голосов
/ 28 мая 2009

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

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

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

Есть идеи, как решить эту проблему?

Ответы [ 3 ]

0 голосов
/ 28 мая 2009

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

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

0 голосов
/ 28 мая 2009

Изменить свойство времени ожидания объекта SqlConnection

0 голосов
/ 28 мая 2009

Когда вы говорите, что он работает нормально в 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;
...