Тайм-аут выполнения SQL оператора
Данная функциональность позволяет автоматически прекратить выполнение SQL оператора, если он выполняется дольше заданного значения тайм-аута.
Данная функция может быть полезна для:
-
Администраторов баз данных. Они получают инструмент для ограничения времени выполнения тяжёлых запросов, которые потребляют много ресурсов;
-
Разработчиков приложений. Они могут использовать тайм-ауты SQL операторов при написании и отладке сложных запросов с заранее неизвестным временем выполнения;
-
Тестеров, которые могут использовать тайм-ауты SQL операторов для обнаружения долго выполняющихся запросов и обеспечения конечного времени выполнения набора тестов.
Эта функциональность работает следующим образом.Когда начинается выполнение оператора (или открывается курсор) Firebird запускает специальный таймер.Выборка записей (fetch) не сбрасывает таймер.Таймер останавливается если выполнение SQL оператора закончено или извлечена (fetch) последняя запись.
По истечению тайм-аута:
-
Если выполнение SQL оператора активно, оно останавливается в заданный момент.
-
Если SQL оператор не активен в данный момент (например между выборками (fetch)), то он будет помечен как отменённый, следующая выборка (fetch) прервёт выполнение и будет возвращена ошибка.
Значение тайм-аута может быть установлено:
-
На уровне базы данных. Значение параметра
StatementTimeout
может быть установлено в firebird.conf (или databases.conf) администратором базы данных. Область действия все операторы во всех соединениях. ПараметрStatementTimeout
устанавливает тайм-аут в секундах, по истечении которого выполнение SQL операторов будет отменено. Ноль означает, что тайм-аут не установлен. Значение по умолчанию равно 0. -
На уровне соединения. Может быть установлен с использованием API (в миллисекундах) или с помощью SQL оператора
SET STATEMENT TIMEOUT
. Область действия текущее подключение. -
На уровне оператора. Может быть установлен с использованием API (в миллисекундах). Область действия текущий SQL оператор.
Эффективное значение тайм-аута SQL оператора вычисляется каждый раз, когда запускается SQL оператор (открывается курсор), следующим образом:
-
если тайм-аут не установлен на уровне оператора, будет использовано значение тайм-аута уровня соединения;
-
если тайм-аут не установлен на уровне соединения, будет использовано значение тайм-аута уровня базы данных;
-
значение тайм-аута не может быть больше, чем значение установленное на уровне базы данных. Таким образом, значение тайм-аута может перекрываться разработчиком приложения в более низких областях, но оно не может выти за пределы установленные DBA в конфигурации.
Нулевой тайм-аут не обозначает отсутствие тайм-аута, просто в этом случае таймер выполнения оператора не запускается.
Несмотря на то, что тайм-аут выполнения SQL оператора может быть установлен в миллисекундах, абсолютная точность не гарантируется.При высокой нагрузке он может быть менее точным.Единственная гарантия которую может дать Firebird это то, что тайм-аут не сработает раньше указанного момента.Клиентское приложение может ждать больше времени, чем установленное значение тайм-аута если движку Firebird необходимо отменить множество действий связанных с отменой оператора.
Тайм-аут выполнения оператора игнорируется для всех внутренних запросов, которые используется движком Firebird.Кроме того, тайм-аут игнорируется для DDL операторов.