Неблокирующие запросы¶
При работе с распределенными SQL-запросами следует принимать в расчет следующие факторы:
- SQL-запрос может вызывать значительные задержки и блокировать транзакционный поток, что будет мешать выполнению других запросов;
- SQL-запрос не должен приводить к исчерпанию памяти на отдельных узлах кластера
- при объединении результатов локальных запросов в виртуальную таблицу на узле-маршрутизаторе нужно следить, чтобы эта таблица не разрасталась бесконтрольно
Для решения этих задач в DQL- и DML-запросах предусмотрены следующие необязательные опции:
SQL_VDBE_MAX_STEPS
, ограничение на максимальное количество инструкций при исполнении локального плана (VDBE) на узле кластера.VTABLE_MAX_ROWS
, ограничение на максимальное число строк в результирующей виртуальной таблице, собирающей результаты отдельных локальных запросов.
Примеры¶
Тестовые таблицы
Примеры использования команд включают в себя запросы к тестовым таблицам.
SELECT * FROM warehouse OPTION(SQL_VDBE_MAX_STEPS = 30, VTABLE_MAX_ROWS = 5);
+----+----------+---------+
| ID | ITEM | TYPE |
+=========================+
| 1 | "bricks" | "heavy" |
|----+----------+---------|
| 2 | "bars" | "light" |
|----+----------+---------|
| 3 | "blocks" | "heavy" |
|----+----------+---------|
| 4 | "piles" | "light" |
|----+----------+---------|
| 5 | "panels" | "light" |
+----+----------+---------+
(5 rows)
Если ограничения не позволяют выполнить запрос, то будет возвращена ошибка.
При слишком низком значении SQL_VDBE_MAX_STEPS
:
---
- null
- ("Reached a limit on max executed vdbe opcodes. Limit: 29\")
...
При слишком низком значении VTABLE_MAX_ROWS
:
---
- null
- (Exceeded maximum number of rows (4) in virtual table: 5\")
...