10.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.