Перейти к содержанию

Неблокирующие запросы

При работе с распределенными 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\")
...