Могу ли я прервать выполнение определенного оператора SQL после заданного промежутка времени? - PullRequest
2 голосов
/ 06 мая 2009

Я хотел бы иметь возможность прервать конкретный оператор SQL, если это займет больше указанного количества секунд. Как я могу это сделать?

Например, я хотел бы сделать что-то вроде:


SET NextStatementTimeOutSeconds = 60
SELECT * FROM MyTable
IF @@LastStatementTimedOut = 1
    PRINT 'Statement timed out after 60 seconds'
ELSE
    PRINT 'Statement completed in less than 60 seconds'

Обратите внимание, что я набрал NextStatementTimeOutSeconds и @@LastStatementTimedOut, чтобы проиллюстрировать, что я хотел бы сделать.


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

Справочная информация. У нас есть несколько хранимых процедур, которые я бы хотел выполнять быстрее, чем X секунд. Так что я бы назвал их один за другим; и если на это уйдет больше X секунд, я просто откажусь и выведу утверждение типа «sproc 13 занимает слишком много времени». Данные меняются, и я пробую разные изменения индекса, поэтому я хотел бы проверить все спроки по времени после таких изменений, чтобы убедиться, что все они меньше X секунд.

Ответы [ 4 ]

3 голосов
/ 06 мая 2009

Обычно время ожидания устанавливается для команды, которая выдает инструкцию SQL. Если это, например, в C #, то вы устанавливаете свойство IDbCommand.CommandTimeout, и оно выдаст исключение SQLException после истечения времени ожидания, если инструкция еще не завершена. Это откатит все транзакции.

В запланированных задачах на SQL Server я бы ожидал, что при настройке задания в элементе управления вверх / вниз будет значение, позволяющее изменить время ожидания задания. Я думаю, что терминология в SQL Server - это «Тайм-аут выполнения», но я не знаю, как его установить, боюсь.

Суть в том, чтобы взглянуть на объект, выполняющий оператор, а не на сам оператор.

1 голос
/ 06 мая 2009

Если вы используете SQL Server, вы можете добавить связанный сервер в базу данных, где будет выполняться запрос. Вы можете установить время ожидания для связанного сервера, например:

EXEC master.dbo.sp_serveroption @server=N'linkedserver', 
    @optname=N'query timeout', @optvalue=N'1'

Затем вы можете выполнить запрос как:

select * from openquery(linkedserver,'select * from ...')

Вы можете использовать блок TRY ... CATCH , чтобы зафиксировать время ожидания, когда оно происходит:

begin try
select * from openquery(linkedserver,'select * from ...')
end try
begin catch 
print @@error
end catch

Ошибка @@ будет 7320 для "Истекло время ожидания запроса".

1 голос
/ 06 мая 2009

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

Использование предела стоимости регулятора запросов. возможность указать верхний предел период времени, в течение которого запрос может запустить. Стоимость запроса относится к расчетное время в секундах, требуется завершить запрос на конкретная конфигурация оборудования.

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

Если вы используете sp_configure, чтобы изменить значение предела стоимости регулятора запросов, измененное значение является общим для сервера. к изменить значение для каждого соединения основа, используйте набор Заявление QUERY_GOVERNOR_COST_LIMIT.

Опция ограничения цены регулятора запросов это расширенный вариант. Если ты используя хранимую систему sp_configure Процедура изменения настроек, вы можно изменить ограничение стоимости регулятора запросов только когда выставлены расширенные опции показа до 1. Настройка вступает в силу немедленно (без сервера рестарт).

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

Одной из возможностей может быть то, что вы можете отслеживать все активные соединения и убивать любые, которые активны в течение вашего тайм-аута.

Хотя я никогда не делал ничего подобного раньше.

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