Неблокирующие запросы¶
При работе с распределенными 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\")
...