Oracle recommends that you don’t switch on auto-capture indefinitely. Instead, capture new queries when changes have been made to applications and workloads. Bulk capture (from the cursor cache or from SQL tuning sets) is a good on-going approach too.
If your application uses literal variables instead of sharable SQL, then consider setting the CURSOR_SHARING parameter to SIMILAR in an attempt to avoid an unmanageable number of baselines being created (each the same except for the literal values).
SHOW PARAMETER OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES
if TRUE then Auto Capture is EnabledSHOW PARAMETER OPTIMIZER_USE_SQL_PLAN_BASELINES
should be TRUE (if FALSE, then all Baselines will be ignored)ALTER SYSTEM SET OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES=TRUE SCOPE=BOTH;
ALTER SYSTEM SET OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES=FALSE SCOPE=BOTH;
NOTE: Even if OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES is set to FALSE the optimizer will still auto capture new baselines for SQL where Enabled baselines already exist... unless one of the baselines is marked as Fixed.COLUMN parameter_name FORMAT a40
SELECT parameter_name, parameter_value
FROM dba_sql_management_config;
exec DBMS_SPM.CONFIGURE('plan_retention_weeks',5);
exec DBMS_SPM.CONFIGURE('space_budget_percent',10);
COLUMN PARAMETER_NAME FORMAT a25
COLUMN VALUE FORMAT a10
SELECT PARAMETER_NAME,
PARAMETER_VALUE AS "VALUE"
FROM DBA_ADVISOR_PARAMETERS
WHERE (
( TASK_NAME = 'SYS_AUTO_SPM_EVOLVE_TASK')
AND
(
( PARAMETER_NAME = 'ACCEPT_PLANS')
OR
( PARAMETER_NAME = 'LOCAL_TIME_LIMIT')
OR
( PARAMETER_NAME = 'TIME_LIMIT')
)
);
Automatic Evolve may be appropriate for your database. Only Disable this functionality if you have justification.
BEGIN
DBMS_SPM.SET_EVOLVE_TASK_PARAMETER( task_name => 'SYS_AUTO_SPM_EVOLVE_TASK' ,
parameter => 'ACCEPT_PLANS' ,
value => 'false' );
END;
/
BEGIN
DBMS_SPM.SET_EVOLVE_TASK_PARAMETER( task_name => 'SYS_AUTO_SPM_EVOLVE_TASK' ,
parameter => 'ACCEPT_PLANS' ,
value => 'true' );
END;
/
SET PAGESIZE 60
SET LINESIZE 250
COLUMN SQL_HANDLE FORMAT a20
COLUMN PLAN_NAME FORMAT a30
COLUMN CREATOR FORMAT a8
COLUMN CREATED FORMAT a29
COLUMN LAST_MODIFIED FORMAT a29
COLUMN LAST_EXECUTED FORMAT a29
SELECT SQL_HANDLE,
PLAN_NAME,
EXECUTIONS,
CREATOR,
ORIGIN,
CREATED,
LAST_MODIFIED,
LAST_EXECUTED,
ENABLED,
ACCEPTED,
FIXED,
REPRODUCED,
AUTOPURGE
FROM dba_sql_plan_baselines
ORDER BY CREATED
/
SELECT sql_handle, plan_name, enabled, accepted
FROM dba_sql_plan_baselines
WHERE sql_text LIKE '&StartOfSQL%';
SELECT plan_name, sql_text
FROM dba_sql_plan_baselines
WHERE plan_name = '&PLAN_NAME'
/
SET LONG 10000
SELECT * FROM TABLE(DBMS_XPLAN.display_sql_plan_baseline(plan_name=>'&PLAN_NAME'));
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_SQL_PLAN_BASELINE(PLAN_NAME => '&PLAN_NAME', FORMAT => 'OUTLINE'));
Or for slightly more information...
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_SQL_PLAN_BASELINE(PLAN_NAME => '&PLAN_NAME', FORMAT => 'ADVANCED'));
Or to display OUTLINEs for all captured Baselines...
SELECT t.*
FROM ( SELECT DISTINCT plan_name
FROM dba_sql_plan_baselines ) pb,
TABLE(dbms_xplan.display_sql_plan_baseline(PLAN_NAME => pb.plan_name, FORMAT => 'OUTLINE')) t;
SET LONG 10000
SELECT DBMS_SPM.evolve_sql_plan_baseline(sql_handle => '&SQLHANDLE')
FROM dual;
SET SERVEROUTPUT ON
DECLARE
l_plans_altered PLS_INTEGER;
BEGIN
l_plans_altered := DBMS_SPM.alter_sql_plan_baseline(
sql_handle => '&SQL_HANDLE',
plan_name => '&PLAN_NAME',
attribute_name => 'enabled',
attribute_value => 'NO');
DBMS_OUTPUT.put_line('Plans Altered: ' || l_plans_altered);
END;
/
SET SERVEROUTPUT ON
DECLARE
l_plans_dropped PLS_INTEGER;
BEGIN
l_plans_dropped := DBMS_SPM.drop_sql_plan_baseline (
sql_handle => '&SQL_HANDLE',
plan_name => '&PLAN_NAME');
DBMS_OUTPUT.put_line(l_plans_dropped);
END;
/