Можно ли установить время ожидания для запроса SQL на сервере Microsoft SQL? - PullRequest
7 голосов
/ 22 июня 2010

У меня есть сценарий, когда иногда пользователь выбирает правильные параметры и делает запрос, выполнение которого занимает несколько минут или более. Я не могу запретить ему выбирать такую ​​комбинацию параметров (это вполне законно), поэтому я бы хотел установить таймаут для запроса.

Обратите внимание, что я действительно хочу остановить выполнение запроса и откатить любые транзакции, потому что в противном случае он потребляет большую часть ресурсов сервера. Добавьте нетерпеливого пользователя, который перезапустит приложение и попробует комбинацию снова, и вы получите рецепт для катастрофы (читай: SQL Server DoS).

Можно ли это сделать и как?

Ответы [ 5 ]

6 голосов
/ 22 июня 2010

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

Вы можете действительно изменить 600 секунд по умолчанию, используя sp_configure, но это область действия сервера.

3 голосов
/ 19 июня 2016

Humm! Вы пробовали LOCK_TIMEOUT
Запишите, что было изначально, прежде чем выполнять запрос
установите его для вашего запроса
после выполнения запроса установите его обратно в исходное значение

SET LOCK_TIMEOUT 1800;  
SELECT @@LOCK_TIMEOUT AS [Lock Timeout];  
2 голосов
/ 27 декабря 2017

Я мог бы предложить 2 вещи.

1) Если ваш запрос занимает много времени, потому что он использует несколько таблиц, которые могут включать блокировки, довольно быстрое решение - выполнить ваши запросы с помощью «NoLock»."Подсказка.

Просто добавьте Select * from YourTable WITH (NOLOCK) во все ссылки на таблицы, что предотвратит блокировку вашего запроса для одновременных транзакций.

2), если вы хотите быть уверены, что все ваши запросыработает (скажем так) менее чем за 5 секунд, затем вы можете добавить то, что предложил @talha, что мне очень понравилось

Просто добавьте в начало вашего исполнения

SET LOCK_TIMEOUT 5000;   --5 seconds.

И это приведет к тому, что ваш запрос займет менее 5 или потерпит неудачу.Затем вы должны поймать исключение и выполнить откат при необходимости.

Надеюсь, это поможет.

0 голосов
/ 22 июня 2010

Если у вас есть только один запрос, я не знаю, как установить время ожидания на уровне T-SQL.

Однако, если у вас несколько запросов (т.е. сбор данных во временные таблицы) внутри хранимой процедуры вы можете просто контролировать время выполнения с помощью GETDATE(), DATEDIFF() и нескольких INT переменных, хранящих время выполнения каждой части.

0 голосов
/ 22 июня 2010

Вы можете указать время ожидания соединения в строке соединения SQL при подключении к базе данных, например:

"Data Source=localhost;Initial Catalog=database;Connect Timeout=15"

На уровне сервера используйте MSSQLMS для просмотра свойств сервера, а на странице Соединения вы можете указать время ожидания запроса по умолчанию.

Я не совсем уверен, что запросы продолжают выполняться после закрытия клиентского соединения. Запросы не должны занимать так много времени, MSSQL может обрабатывать большие базы данных, я работал с ГБ данных на нем раньше. Запустите профиль производительности для запросов, возможно, некоторые удачно расположенные индексы могут ускорить его, или переписать запрос тоже.

Обновление: Согласно этому списку , тайм-ауты SQL происходят при ожидании подтверждения внимания от сервера:

Предположим, вы выполнили команду, а затем команда истекло. Когда это происходит, драйвер SqlClient отправляет специальный 8-байтовый пакет на сервер, который называется пакетом внимания. Это говорит серверу прекратить выполнение текущей команды. Когда мы отправляем пакет внимания, нам приходится ждать подтверждения внимания от сервера, и теоретически это может занять много времени и времени. Вы также можете отправить этот пакет, вызвав SqlCommand.Cancel для асинхронного объекта SqlCommand. Это особый случай, когда мы используем 5 секундный тайм-аут. В большинстве случаев вы никогда не попадете в этот, сервер обычно очень чувствителен к пакетам внимания, потому что они обрабатываются очень низко на сетевом уровне.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...