Загрузить хороший план из cursor cache как SQL plan baseline
OracleПроизводительностьКоманда
-- 1) Compare the SQL's plans and their performance:
SELECT sql_id, child_number, plan_hash_value, executions,
ROUND(elapsed_time/1e3/NULLIF(executions,0),1) AS ms_per_exec,
sql_plan_baseline
FROM v$sql
WHERE sql_id = '<sql_id>';
-- 2) Load the chosen plan as a baseline:
SET SERVEROUTPUT ON
DECLARE
n PLS_INTEGER;
BEGIN
n := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(
sql_id => '<sql_id>',
plan_hash_value => <plan_hash_value>,
fixed => 'NO',
enabled => 'YES');
DBMS_OUTPUT.PUT_LINE(n || ' plan(s) loaded');
END;
/
-- 3) Verify the baseline:
SELECT sql_handle, plan_name, origin, enabled, accepted, fixed, reproduced,
TO_CHAR(last_executed,'YYYY-MM-DD HH24:MI') AS last_exec
FROM dba_sql_plan_baselines
WHERE signature = (SELECT exact_matching_signature FROM v$sql
WHERE sql_id = '<sql_id>' AND ROWNUM = 1);
-- On subsequent executions v$sql.sql_plan_baseline should be populated.Что делает
С помощью SQL Plan Management делает выбранный план принятым (ACCEPTED) baseline; после этого оптимизатор использует только принятые планы baseline, а вновь найденные планы откладывает до их эволюции (evolve).
Когда использовать
Чтобы вернуться к заведомо хорошему плану при регрессии плана и защитить планы критичных SQL перед обновлением или изменением статистики.
Внимание
В Enterprise Edition дополнительная лицензия не нужна (в SE2 ограничено одним планом baseline на SQL). Требует ADMINISTER SQL MANAGEMENT OBJECT. Baseline применяется к точно такому же тексту SQL (сигнатуре); для SQL с литералами он не помогает. Если индекс, используемый планом, удалён, план не может быть воспроизведён (REPRODUCED=NO), и оптимизатор возвращается к выбору по стоимости. OPTIMIZER_USE_SQL_PLAN_BASELINES должен быть TRUE (по умолчанию).
Связанные материалы
- Сделать снимок AWR и сформировать отчёт AWR между двумя снимками
- Отчёт AWR diff (compare period) между двумя периодами
- Топ wait events и топ SQL из ASH за последние минуты
- Выполнить анализ ADDM и получить отчёт
- Получить отчёт SQL Monitor (выполняющийся или завершённый долгий SQL)
- Включить/выключить трассировку 10046 для сессии и обобщить её через TKPROF