DBAtlas · Atlas für Datenbankbetrieb

Guten Plan aus dem Cursor Cache als SQL Plan Baseline laden

OraclePerformance

Befehl

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

Was es tut

Macht den gewählten Plan per SQL Plan Management zu einer ACCEPTED-Baseline; der Optimizer verwendet dann nur akzeptierte Baseline-Pläne und stellt neu gefundene Pläne zurück, bis sie evolviert sind.

Wann einsetzen

Um bei einer Planregression zu einem bekannt guten Plan zurückzukehren und um Pläne kritischer SQL vor einem Upgrade oder einer Statistikänderung zu schützen.

Vorsicht

Keine Zusatzlizenz in der Enterprise Edition (in SE2 auf einen Baseline-Plan je SQL beschränkt). Erfordert ADMINISTER SQL MANAGEMENT OBJECT. Eine Baseline gilt für exakt denselben SQL-Text (Signatur); bei SQL mit Literalen hilft sie nicht. Wird ein vom Plan verwendeter Index gelöscht, lässt sich der Plan nicht reproduzieren (REPRODUCED=NO) und der Optimizer fällt auf die kostenbasierte Wahl zurück. OPTIMIZER_USE_SQL_PLAN_BASELINES muss TRUE sein (Standard).

In DBAtlas öffnen →

Verwandte Einträge