Неблокирующие запросы¶
Ситуации возможных блокировок¶
При работе с распределенными SQL-запросами следует принимать в расчет следующие факторы:
- SQL-запрос может вызывать значительные задержки и блокировать транзакционный поток, что будет мешать выполнению других запросов
- SQL-запрос не должен приводить к исчерпанию памяти на отдельных узлах кластера
- при объединении результатов локальных запросов в виртуальную таблицу на узле-маршрутизаторе нужно следить, чтобы эта таблица не разрасталась бесконтрольно
Параметры для ограничения запросов¶
Для решения этих задач в DQL- и DML-запросах предусмотрены следующие необязательные параметры:
SQL_VDBE_MAX_STEPS
, ограничение на максимальное количество команд при исполнении локального плана виртуальным движком базы данных (VDBE) на экземпляре кластера.VTABLE_MAX_ROWS
, ограничение на максимальное число строк в промежуточной виртуальной таблице, собирающей результаты отдельных локальных запросов.
Параметр SQL_VDBE_MAX_STEPS
ограничивает счетчик команд при исполнении
скомпилированного запроса из
опкодов в VDBE-машине (число команд
прямо пропорционально числу опкодов). Ограничение влияет на количество
обработанных кортежей локальным SQL на узлах кластера в DQL-запросах и
позволяет предотвратить выполнение SQL-команды в тех случаях, если
запрашиваемая таблица слишком велика. Это может сигнализировать
пользователю о необходимости переделать запрос (например, отказаться от
полного сканирования (SELECT * ...
) такой таблицы в пользу выборке
данных по индексу).
Cм. также:
Примеры¶
Тестовые таблицы
Примеры использования команд включают в себя запросы к тестовым таблицам.
Пример совместного использования SQL_VDBE_MAX_STEPS
и 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: XX\")
...
При слишком низком значении VTABLE_MAX_ROWS
:
---
- null
- (Exceeded maximum number of rows (4) in virtual table: Х\")
...