ACE Director Alum Daniel Morgan, founder of Morgan's Library, is scheduling
complimentary technical Workshops on Database Security for the first 30
Oracle Database customers located anywhere in North America, EMEA, LATAM, or
APAC that send an email to
asra_us@oracle.com. Request a Workshop for
your organization today.
Purpose
SPM stands for SQL Plan Management and this package is part of the feature set introduced to support tuning advisor functionality.
AUTHID
CURRENT_USER
Constants
Name
Data Type
Value
AUTO_LIMIT
INTEGER
2147483647-1
NO_LIMIT
INTEGER
2147483647
Data Types
TYPE name_list IS TABLE OF VARCHAR2(30);
Dependencies
DBA_SQL_PLAN_BASELINES
DBMS_SPM_INTERNAL
DBMS_SYS_ERROR
DBMS_ADVISOR
DBMS_SPM_LIB
DBMS_XPLAN_LIB
DBMS_ASSERT
DBMS_SQLDIAG
DUAL
DBMS_AUTO_INDEX_INTERNAL
DBMS_SQLTUNE
PLITBLM
DBMS_AUTO_TASK_ADMIN
DBMS_SQLTUNE_INTERNAL
PRVT_ADVISOR
DBMS_LOB
DBMS_SQLTUNE_UTIL1
SQL_PLAN_TABLE_TYPE
DBMS_SMB
DBMS_SQLTUNE_UTIL2
XMLTYPE
DBMS_SMB_INTERNAL
DBMS_STANDARD
Documented
Yes
Exceptions
Error Code
Reason
ORA-13602
The specified parameter <parameter_name> is not valid for task or object <task_name>.
ORA-13605
The specified task or object <string> does not exist for the current user.
ORA-13609
The specified task <string> must be executing to be cancelled or interrupted.
ORA-13631
The most recent execution of task <task_name> contains no results.
Changes an attribute of a single plan or all plans associated with a SQL statement using the attribute name/value format
dbms_spm.alter_sql_plan_baseline(
sql_handle IN VARCHAR2 := NULL,
plan_name IN VARCHAR2 := NULL,
attribute_name IN VARCHAR2,
attribute_value IN VARCHAR2)
RETURN PLS_INTEGER;
Name
Description
Value
autopurge
'YES' means the plan is purged if it is not used for a time period. 'NO' means never purge
'YES' or 'NO'
description
SQL Plan's description
'YES' or 'NO'
enabled
'YES' means the plan is available for use by the optimizer depending on accepted status
'YES' or 'NO'
fixed
'YES' means the baseline is not evolved. A fixed plan takes precedence over a non-fixed plan
30 char
plan_name
SQL Plan's name
30 char
conn / as sysdba
set linesize 121
col name format a40
col value format a30
SELECT name, value
FROM gv$parameter
WHERE name LIKE 'optimizer_capture%';
ALTER SYSTEM SET optimizer_capture_sql_plan_baselines=TRUE SCOPE=MEMORY;
SELECT name, value
FROM gv$parameter
WHERE name LIKE 'optimizer_capture%';
GRANT select ON dba_sql_plan_baselines TO uwclass;
desc dba_sql_plan_baselines
SELECT sql_handle, autopurge
FROM dba_sql_plan_baselines;
set serveroutput on
DECLARE
i NATURAL;
BEGIN
i := dbms_spm.alter_sql_plan_baseline('SYS_SQL_ffb0d0ba09dba808',
attribute_name => 'autopurge', attribute_value => 'NO');
dbms_output.put_line(i);
END;
/
SELECT sql_handle, autopurge
FROM dba_sql_plan_baselines;
DECLARE
i NATURAL;
BEGIN
i := dbms_spm.alter_sql_plan_baseline('SYS_SQL_ffb0d0ba09dba808',
attribute_name => 'autopurge', attribute_value => 'YES');
dbms_spm.create_evolve_task(
sql_handle IN VARCHAR2 := NULL,
plan_name IN VARCHAR2 := NULL,
time_limit IN NUMBER := dbms_spm.auto_limit,
task_name IN VARCHAR2 := NULL,
description IN VARCHAR2 := NULL)
RETURN VARCHAR2;
SELECT owner, task_id, execution_start, execution_end, status
FROM dba_advisor_log
WHERe task_name = 'UWEVOLVE';
exec dbms_spm.drop_evolve_task('UWEVOLVE');
SELECT COUNT(*)
FROM dba_advisor_objects
WHERE task_name = 'UWEVOLVE';
Overload 2
dbms_spm.create_evolve_task(
plan_list IN dbms_spm.name_list,
time_limit IN NUMBER := dbms_spm.auto_limit,
task_name IN VARCHAR2 := NULL,
description IN VARCHAR2 := NULL)
RETURN VARCHAR2;
Implements a plan based on the recommendation of an evolve task
dbms_spm.implement_evolve_task(
task_name IN VARCHAR2,
task_owner IN VARCHAR2 := NULL,
execution_name IN VARCHAR2 := NULL,
force IN BOOLEAN := FALSE)
RETURN NUMBER;
Load plans from AWR as SQL plan baselines. Can be used to load the SQL Management Base (SMB) with SQL plan baselines for a set of SQL statements using the plans from the AWR
dbms_spm.load_plans_from_awr(
begin_snap IN NUMBER,
end_snap IN NUMBER,
basic_filter IN VARCHAR2 := NULL,
fixed IN VARCHAR2 := 'NO',
enabled IN VARCHAR2 := 'YES',
commit_rows IN NUMBER := 1000,
dbid IN NUMBER := NULL)
RETURN PLS_INTEGER;
col instart_fmt noprint;
col inst_name format a12 heading 'Instance';
col db_name format a12 heading 'DB Name';
col snap_id format 99999990 heading 'Snap Id';
col snapdat format a18 heading 'Snap Started' just c;
col lvl format 99 heading 'Snap|Level';
set heading on;
break on inst_name on db_name on host on instart_fmt skip 1;
ttitle off;
SELECT TO_CHAR(s.startup_time) INST_START,
di.instance_name INST_NAME, di.db_name DB_NAME, s.snap_id SNAP_ID,
TO_CHAR(s.end_interval_time,'DD MON YYYY HH24:MI') SNAPDAT, s.snap_level LVL
FROM dba_hist_snapshot s, dba_hist_database_instance di
WHERE di.dbid = s.dbid
AND di.instance_number = s.instance_number
AND di.startup_time = s.startup_time
ORDER BY snap_id;
Loads one or more plans present in the cursor cache for a SQL statement
Overload 1
dbms_spm.load_plans_from_cursor_cache(
attribute_name IN VARCHAR2,
attribute_value IN VARCHAR2,
fixed IN VARCHAR2 := 'NO',
enabled IN VARCHAR2 := 'YES')
RETURN PLS_INTEGER;
TBD
Overload 2
dbms_spm.load_plans_from_cursor_cache(
sql_id IN VARCHAR2,
plan_hash_value IN NUMBER := NULL,
fixed IN VARCHAR2 := 'NO',
enabled IN VARCHAR2 := 'YES')
RETURN PLS_INTEGER;
TBD
Overload 3
dbms_spm.load_plans_from_cursor_cache(
sql_id IN VARCHAR2,
plan_hash_value IN NUMBER := NULL,
sql_text IN CLOB,
fixed IN VARCHAR2 := 'NO',
enabled IN VARCHAR2 := 'YES')
RETURN PLS_INTEGER;
alter system flush shared_pool;
-- inefficient plan
SELECT /*+ NO_USE_NL(s,i) EVIL*/ DISTINCT s.srvr_id
FROM servers s, serv_inst i
WHERE s.srvr_id = i.srvr_id;
3fub5wp0wwnad
6aptf1mfmdkx7
SELECT sql_id
FROM gv$sql
WHERE sql_text LIKE '%EVIL%';
-- more efficient plan
SELECT /*+ NO_USE_NL(s,i) GOOD*/ DISTINCT s.srvr_id
FROM servers s, serv_inst i
WHERE s.srvr_id =i.srvr_id;
SELECT sql_id
FROM gv$sql
WHERE sql_text LIKE '%GOOD%';
2297mpruc77wp
2cry6yrdvrvvg
DECLARE
i NATURAL;
BEGIN
i := dbms_spm.load_plans_from_cursor_cache('3fub5wp0wwnad');
i := dbms_spm.load_plans_from_cursor_cache('6aptf1mfmdkx7');
i := dbms_spm.load_plans_from_cursor_cache('2297mpruc77wp');
i := dbms_spm.load_plans_from_cursor_cache('2cry6yrdvrvvg');
END;
/
SELECT sql_handle, 'E'
FROM dba_sql_plan_baselines
WHERE sql_text LIKE '%EVIL%'
UNION
SELECT sql_handle, 'G'
FROM dba_sql_plan_baselines
WHERE sql_text LIKE '%GOOD%';
SYS_SQL_2421c46352e4a294 E
SYS_SQL_5ff768628a8142c5 G
SYS_SQL_c1ac82aaff233e4a G
SYS_SQL_eb7bc6820dc885a5 E
SELECT dbms_spm.evolve_sql_plan_baseline('SYS_SQL_eb7bc6820dc885a5')
FROM dual;
Overload 4
dbms_spm.load_plans_from_cursor_cache(
sql_id IN VARCHAR2,
plan_hash_value IN NUMBER := NULL,
sql_handle IN VARCHAR2,
fixed IN VARCHAR2 := 'NO',
enabled IN VARCHAR2 := 'YES')
RETURN PLS_INTEGER;
Loads plans stored in a SQL tuning set (STS) into SQL plan baselines
dbms_spm.load_plans_from_sqlset(
sqlset_name IN VARCHAR2,
sqlset_owner IN VARCHAR2 := NULL,
basic_filter IN VARCHAR2 := NULL,
fixed IN VARCHAR2 := 'NO',
enabled IN VARCHAR2 := 'YES'
commit_rows IN NUMBER := 1000)
RETURN PLS_INTEGER;
Displays the results of an execution of an automatic evolve task
dbms_spm.report_auto_evolve_task(
type IN VARCHAR2 := 'TEXT',
level IN VARCHAR2 := 'TYPICAL',
section IN VARCHAR2 := 'ALL',
object_id IN NUMBER := NULL,
execution_name IN VARCHAR2 := NULL)
RETURN CLOB;
DECLARE
cVal CLOB;
BEGIN
cVal := dbms_spm.report_auto_evolve_task;
dbms_output.put_line(cVal);
END;
/
dbms_spm.report_evolve_task(
task_name IN VARCHAR2,
type IN VARCHAR2 := 'TEXT',
level IN VARCHAR2 := 'TYPICAL',
section IN VARCHAR2 := 'ALL',
object_id IN NUMBER := NULL,
task_owner IN VARCHAR2 := NULL,
execution_name IN VARCHAR2 := NULL)
RETURN CLOB;
DECLARE
cVal CLOB;
BEGIN
cVal := dbms_spm.report_evolve_task('UWEVOLVE');
dbms_output.put_line(cVal);
END;
/