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

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

Ситуации возможных блокировок

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