Spec-Zone.ru › MySQL 5.7

8.15.4 Очистка следа оптимизации

По умолчанию каждый новый след перезаписывает предыдущий. Таким образом, если утверждение содержит подутверждения (например, вызов хранимых процедур, хранимых функций или триггеров), верхнее утверждение и подутверждения каждый генерируют один след, но в конце выполнения виден только след последнего подутверждения.

Пользователь, который хочет увидеть след другого подутверждения, может включить или отключить отслеживание для нужного подутверждения, но это требует редактирования кода процедуры, что не всегда возможно. Другое решение — настроить очистку следа. Это делается путем установки системных переменных optimizer_trace_offset и optimizer_trace_limit, как показано ниже:

SET optimizer_trace_offset=offset, optimizer_trace_limit=limit;

offset — целое число со знаком (по умолчанию -1); limit — целое положительное число (по умолчанию 1). Такое утверждение SET имеет следующие последствия:

  • Все ранее сохранённые следы очищаются из памяти.

  • Последующий запрос SELECT из таблицы OPTIMIZER_TRACE возвращает первые limit следов из offset старейших сохранённых следов (если offset ≥ 0), или первые limit следов из -offset самых новых сохранённых следов (если offset < 0).

Примеры:

  • SET optimizer_trace_offset=-1, optimizer_trace_limit=1: отображается самый последний след (по умолчанию).

  • SET optimizer_trace_offset=-2, optimizer_trace_limit=1: отображается предпоследний след.

  • SET optimizer_trace_offset=-5, optimizer_trace_limit=5: отображаются последние пять следов.

Отрицательные значения для offset могут оказаться полезными, когда подутверждения, представляющие интерес, являются последними несколькими в хранимой процедуре. Например:

SET optimizer_trace_offset=-5, optimizer_trace_limit=5;

CALL stored_routine(); # more than 5 substatements in this routine

SELECT * FROM information_schema.OPTIMIZER_TRACE; # see only the last 5 traces

Положительное значение offset может быть полезным, когда известно, что подутверждения, представляющие интерес, находятся среди первых нескольких в хранимой процедуре.

Чем точнее установлены эти две переменные, тем меньше используется памяти. Например, SET optimizer_trace_offset=0, optimizer_trace_limit=5 требует достаточной памяти для хранения пяти следов, поэтому, если требуются только три первых, лучше использовать SET optimizer_trace_offset=0, optimizer_trace_limit=3, так как отслеживание прекращается после limit следов. Хранимая процедура может иметь цикл, который выполняет множество подутверждений и, таким образом, генерирует множество следов, которые могут использовать много памяти; в таких случаях выбор подходящих значений для offset и limit может ограничить отслеживание, например, одной итерацией цикла. Это также снижает влияние отслеживания на скорость выполнения.

Если offset больше или равно 0, в памяти хранятся только limit следов. Если offset меньше 0, это не так: вместо этого в памяти хранятся -offset следов. Даже если limit меньше -offset, исключая последнее утверждение, последнее утверждение все равно должно отслеживаться, потому что оно будет находиться в пределах предела после выполнения ещё одного утверждения. Поскольку смещение меньше 0 рассчитывается с конца, «окно» перемещается по мере выполнения дополнительных утверждений.

Использование optimizer_trace_offset и optimizer_trace_limit, которые являются ограничениями на уровне производителя следов, обеспечивают лучшую (большую) скорость и (меньшее) использование памяти по сравнению с настройкой смещений или ограничений на уровне потребителя следов (SQL) с SELECT * FROM OPTIMIZER_TRACE LIMIT limit OFFSET offset, что практически ничего не экономит.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/tuning-trace-purging.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API