ЗАЯВЛЕНИЕ SET
В MariaDB 10.1.2 были введены переменные на уровне запроса.
SET STATEMENT может использоваться для установки значения системной переменной на время выполнения данного запроса. Также можно установить несколько переменных.
Синтаксис
SET STATEMENT var1=value1 [, var2=value2, ...] FOR <statement>
где varN — это системная переменная (список разрешенных переменных приведен ниже), а valueN — это константа-литерал.
Описание
SET STATEMENT var1=value1 FOR stmt
приблизительно эквивалентно
SET @save_value=@@var1; SET SESSION var1=value1; stmt; SET SESSION var1=@save_value;
Сервер анализирует всё заявление до его исполнения, поэтому любые переменные, установленные таким способом, которые влияют на анализатор, могут не иметь ожидаемого эффекта. Примеры включают переменные кодировки символов, sql_mode=ansi_quotes и т. д.
Примеры
Можно ограничить время выполнения запроса max_statement_time:
SET STATEMENT max_statement_time=1000 FOR SELECT ... ;
Можно включить/выключить отдельные оптимизации:
SET STATEMENT optimizer_switch='materialization=off' FOR SELECT ....;
Можно включить MRR/BKA для запроса:
SET STATEMENT join_cache_level=6, optimizer_switch='mrr=on' FOR SELECT ...
Обратите внимание, что бессмысленно пытаться установить сессионную переменную внутри SET STATEMENT:
#USELESS STATEMENT SET STATEMENT sort_buffer_size = 100000 for SET SESSION sort_buffer_size = 200000;
В приведенном выше примере после установки sort_buffer_size на 200000 она будет сброшена до своего первоначального состояния (состояния до начала SET STATEMENT ) после выполнения запроса.
Ограничения
Существует ряд переменных, которые нельзя установить на уровне отдельного запроса. К ним относятся:
-
autocommit -
character_set_client -
character_set_connection -
character_set_filesystem -
collation_connection -
default_master_connection -
debug_sync -
interactive_timeout -
gtid_domain_id -
last_insert_id -
log_slow_filter -
log_slow_rate_limit -
log_slow_verbosity -
long_query_time -
min_examined_row_limit -
profiling -
profiling_history_size -
query_cache_type -
rand_seed1 -
rand_seed2 -
skip_replication -
slow_query_log -
sql_log_off -
tx_isolation -
wait_timeout
Источник
- Функция первоначально была реализована в рамках Google Summer of Code 2009 проектом Джозефа Лукаса.
- Percona Server 5.6 включал её как заявление переменной на уровне запроса
- MariaDB перенесла исправление и исправила много ошибок. Задача в MariaDB Jira — MDEV-5231.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/set-statement/