Ограничение времени исполнения запроса
Содержание раздела
Система поддерживает следующие способы ограничения время исполнения:
- [запроса целиком] с помощью общего тайм-аута запроса;
- [этапа исполнения в СУБД] с помощью специального указания.
Возможность доступна для запросов к СУБД ADP, ADB и ADQM.
Общий тайм-аут запроса
Общий тайм-аут запроса определяет максимальное время исполнения всего запроса с момента получения запроса системой и до возврата последней порции данных в ответе.
Тайм-аут учитывает все этапы обработки запроса, включая этап исполнения в СУБД. Если он истек в процессе обработки запроса, оставшиеся этапы обработки пропускаются и возвращается ошибка.
Общий тайм-аут задается:
- [в HTTP-запросах] с помощью параметра fetchTimeoutMs;
- [в JDBC-запросах] с помощью метода setQueryTimeout.
Указание для СУБД
Указание специального вида определяет максимальное время исполнения запроса в СУБД с момента получения ею запроса и до возврата последней порции данных в систему. Это время не учитывает другие этапы обработки запроса до или после исполнения запроса в СУБД.
Указание зависит от типа СУБД:
- [ADP, ADB]
Set(statement_timeout <значение>)— значение задается в миллисекундах; при наличии расширения pg_hint_plan в СУБД также может быть задано в секундах (s), минутах (min), часах (h) или днях (d); - [ADQM]
Set(max_execution_time <значение>)— значение задается в секундах.
Примеры указаний:
-- ADP: значение задано в миллисекундах
/*+ Set(statement_timeout 30000) */
SELECT * FROM marketing.sales
DATASOURCE_TYPE = 'adp2';
-- ADP: значение задано в секундах — формат поддерживается только при наличии pg_hint_plan
/*+ Set(statement_timeout 30s) */
SELECT * FROM marketing.sales
DATASOURCE_TYPE = 'adp2';
-- ADB: значение задано в миллисекундах
/*+ Set(statement_timeout 30000) */
SELECT * FROM marketing.sales
DATASOURCE_TYPE = 'adb2';
-- ADB: значение задано в минутах — формат поддерживается только при наличии pg_hint_plan
/*+ Set(statement_timeout 0.5min) */
SELECT * FROM marketing.sales
DATASOURCE_TYPE = 'adb2';
-- ADQM: значение задано в секундах
/*+ Set(max_execution_time 30) */
SELECT * FROM marketing.sales
DATASOURCE_TYPE = 'adqm2';
Подробнее о синтаксисе и обработке указаний в разделе Указания для планировщика запросов СУБД (hints).
Как определяется итоговое ограничение для СУБД
Итоговое ограничение на время исполнения запроса, передаваемое системой в СУБД, зависит от следующих факторов, как показано в таблице ниже:
- типа СУБД;
- способа задания ограничения: указание или общий тайм-аут запроса;
- [для ADP, ADB] значения параметра конфигурации
[ADP\|ADB]_PG_HINT_PLAN_EXTENSION_ENABLED.
| Тип СУБД | Указание | Общий тайм-аут запроса | [ADP\|ADB]_PG_HINT_PLAN_EXTENSION_ENABLED* | Итоговое ограничение, передаваемое в СУБД |
|---|---|---|---|---|
| ADP, ADB, ADQM | – | – | false/true/отсутствует | Отсутствует |
| ADP, ADB, ADQM | – | + | false/true/отсутствует | Общий тайм-аут минус время предобработки** запроса |
| ADP, ADB, ADQM | + | – | false/true/отсутствует | Значение указания |
| ADP, ADB | + | + | false | Оба значения передаются в СУБД последовательно как SET LOCAL statement_timeout:
|
| ADP, ADB | + | + | true | Два независимых ограничения:
|
| ADQM | + | + | false/true/отсутствует | Оба значения передаются в СУБД последовательно как часть конструкции SETTINGS:
|
* Параметры игнорируются для ADQM.
** Под временем предобработки запроса понимается время, уже потраченное системой к моменту передачи запроса в СУБД.