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

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

При работе с распределенными SQL-запросами следует принимать в расчет следующие факторы:

  • SQL-запрос может вызывать значительные задержки и блокировать транзакционный поток, что будет мешать выполнению других запросов;
  • SQL-запрос не должен приводить к исчерпанию памяти на отдельных узлах кластера
  • при объединении результатов локальных запросов в виртуальную таблицу на узле-маршрутизаторе нужно следить, чтобы эта таблица не разрасталась бесконтрольно

Для решения этих задач в DQL- и DML-запросах предусмотрены следующие необязательные опции:

  • SQL_VDBE_MAX_STEPS, ограничение на максимальное количество инструкций при исполнении локального плана ( VDBE) на узле кластера.
  • VTABLE_MAX_ROWS, ограничение на максимальное число строк в результирующей виртуальной таблице, собирающей результаты отдельных локальных запросов.

Примеры

SELECT * FROM "characters" OPTION(SQL_VDBE_MAX_STEPS = 55, VTABLE_MAX_ROWS = 10);
---
- metadata:
  - {'name': 'id', 'type': 'integer'}
  - {'name': 'name', 'type': 'string'}
  - {'name': 'year', 'type': 'integer'}
  rows:
  - [1, 'Woody', 1995]
  - [2, 'Buzz Lightyear', 1995]
  - [3, 'Bo Peep', 1995]
  - [4, 'Mr. Potato Head', 1995]
  - [5, 'Slinky Dog', 1995]
  - [6, 'Barbie', 2010]
  - [7, 'Daisy', 2010]
  - [8, 'Forky', 2019]
  - [9, 'Dragon', 2019]
  - [10, 'The Dummies', 2019]
...

Если ограничения не позволяют выполнить запрос, то будет возвращена ошибка.

При слишком низком значении SQL_VDBE_MAX_STEPS:

---
- null
- ("Reached a limit on max executed vdbe opcodes. Limit: 54\")
...

При слишком низком значении VTABLE_MAX_ROWS:

---
- null
- (Exceeded maximum number of rows (9) in virtual table: 10\")
...