Подтвердить что ты не робот

Запрос времени из веб-приложения, но отлично работает от студии управления

Это вопрос, который я задал на другом форуме, который получил некоторые достойные ответы, но я хотел посмотреть, есть ли у кого-нибудь здесь больше понимания.

Проблема заключается в том, что у вас есть одна из ваших страниц в тайм-ауте веб-приложения, когда она попадает на вызов хранимой процедуры, поэтому вы используете Sql Profiler или журналы трассировки приложений, чтобы найти запрос и вставить его в управление студия, чтобы понять, почему она работает медленно. Но вы запускаете его оттуда, и он просто промахивается, возвращаясь менее чем через секунду каждый раз.

В моем конкретном случае использовались ASP.NET 2.0 и Sql Server 2005, но я думаю, что проблема может быть применима к любой системе РСУБД.

4b9b3361

Ответ 1

Это то, что я узнал до сих пор из моих исследований.

.NET отправляет параметры подключения, которые не совпадают с тем, что вы получаете при входе в студию управления. Вот что вы видите, если вы нюхаете соединение с Sql Profiler:

-- network protocol: TCP/IP  
set quoted_identifier off  
set arithabort off  
set numeric_roundabort off  
set ansi_warnings on  
set ansi_padding on  
set ansi_nulls off  
set concat_null_yields_null on  
set cursor_close_on_commit off  
set implicit_transactions off  
set language us_english  
set dateformat mdy  
set datefirst 7  
set transaction isolation level read committed  

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

В этом случае я пробовал каждую настройку отдельно, после отключения и повторного подключения, и обнаружил, что изменение arithabort от "выключено" до "сокращенного" запроса проблемы с 90 секунд до 1 секунды.

Наиболее вероятное объяснение связано с параметрическим обнюхиванием, которое является методом Sql Server, использующим для выбора того, что, по его мнению, является наиболее эффективным планом запроса. Когда вы меняете один из параметров соединения, оптимизатор запросов может выбрать другой план, и в этом случае он, по-видимому, выбрал плохой.

Но я не совсем уверен в этом. Я попытался сравнить фактические планы запросов после изменения этого параметра, и мне еще нужно увидеть, что diff показывает какие-либо изменения.

Есть ли что-то еще в настройке arithabort, которая может вызвать медленное выполнение запроса в некоторых случаях?

Решение оказалось простым: просто поместите set arithabort в верхнюю часть хранимой процедуры. Но это может привести к противоположной проблеме: изменить параметры запроса, и он быстро работает с "выключенным", чем 'on'.

В настоящее время я выполняю процедуру "с перекомпиляцией", чтобы каждый раз регенерировать план. Это хорошо для этого конкретного отчета, так как для перекомпиляции требуется, может быть, секунда, и это не слишком заметно в отчете, который возвращает 1-10 секунд (это монстр).

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

Ответ 2

У меня были подобные проблемы. Попробуйте установить с опцией "WITH RECOMPILE" в sproc create, чтобы заставить систему перепрограммировать план выполнения каждый раз, когда он вызывается. Иногда процессор запросов запутывается в сложных хранимых процедурах с множеством операторов ветвления или case и просто вытягивает действительно субоптимальный план выполнения. Если это, по-видимому, "исправить" проблему, вам, вероятно, потребуется проверить статистику, обновленную и/или сломать sproc.

Вы также можете подтвердить это, профилировав sproc. Когда вы выполняете его из SQL Managment Studio, как сопоставляется IO, когда вы его профилируете из приложения ASP.NET. Если они очень много, это просто повторяет, что он вытягивает плохой план выполнения.

Ответ 3

Вы уже включили трассировку ASP.NET? У меня был экземпляр, где проблема была не в самой хранимой процедуре SQL, а в том, что процедура вернула 5000 строк, и приложение пыталось создать список данных с данными из этих 5000 объектов, которые вызывали проблему.

Вы можете посмотреть время выполнения между функциями веб-приложения, а также через трассировку, чтобы помочь отслеживать все.

Ответ 4

сначала проверьте это на промежуточном поле, измените его на уровне сервера для сервера sql

объявить @option int

set @option = @@options | 64

exec sp_configure "параметры пользователя", @option

RECONFIGURE

Ответ 5

Та же проблема, с которой я столкнулся с SQL-службами. Попробуйте проверить тип переменных, Я отправлял различные типы переменных в SQL, например, отправлял varchar, где он должен быть целым числом или что-то в этом роде. После того, как я синхронизировал типы переменных в Reporting Service и хранимой процедуре SQL, я решил проблему.

Ответ 6

Попробуйте изменить значение тайм-аута SelectCommand:

DataAdapter.SelectCommand.CommandTimeout = 120;

Ответ 7

Вы можете попробовать использовать команду sp_who2, чтобы посмотреть, что делает этот процесс. Это покажет вам, заблокирован ли он другим процессом или чрезмерное количество процессорного времени и/или времени.

Ответ 8

У нас была такая же проблема, и вот что мы узнали.

размер нашего журнала журнала сохранялся по умолчанию (814 МБ), а рост авто составлял 10%. На сервере максимальная память сервера также была сохранена по умолчанию (2147483647 МБ).

Когда наш журнал заполнился и ему нужно было расти, он использовал всю память с сервера, и ничего не оставалось для запуска кода, чтобы он был исчерпан. В результате мы установили начальный размер файла журнала базы данных до 1 МБ и максимальную память сервера до 2048 МБ. Это мгновенно устранило нашу проблему. Конечно, вы можете изменить эти два свойства в соответствии с вашими потребностями, но это идея для тех, кто сталкивается с проблемой тайм-аута при выполнении хранимой процедуры с помощью кода, но в SSMS он работает очень быстро, а приведенные выше решения не помогают.