To load a plan found in an AWR snapshot into the SMB, you need to add it to an STS first, then load it into the SMB.
Here is how:
1. create an empty STS:
exec dbms_sqltune.create_sqlset(sqlset_name=>'mysts');
2. Note the snapshots where your plan was recorded, and add the plans to your STS:
DECLARE
my_cur dbms_sqltune.sqlset_cursor;
BEGIN
OPEN my_cur FOR
SELECT VALUE(x)
FROM TABLE( dbms_sqltune.select_workload_repository(begin_snap=>5840,
end_snap=>5841,
basic_filter=>'sql_id = ''45wmakdh9ak9s''')) x;
dbms_sqltune.load_sqlset(sqlset_name => 'mysts', populate_cursor => my_cur);
END;
/
You can now check your STS for its contents:
select sqlset_name,
sql_id,
plan_timestamp,
parsing_schema_name "schema",
plan_hash_value,round(elapsed_time/1000000) "duration in seconds",
cpu_time,
buffer_gets,
disk_reads,
executions
from dba_sqlset_statements
where sqlset_name = 'mysts'
;
| SQLSET_NAME | SQL_ID | PLAN_TIMESTAMP | schema | PLAN_HASH_VALUE | duration in seconds | CPU_TIME | BUFFER_GETS | DISK_READS | EXECUTIONS |
|---|---|---|---|---|---|---|---|---|---|
| mysts | 45wmakdh9ak9s | 11.09.2018 15:22:13 | SH | 3827183161 | 0 | 0 | 0 | 0 | 0 |
| mysts | 45wmakdh9ak9s | 06.09.2018 16:45:26 | SH | 4026264003 | 579 | 85550842 | 24062750 | 101808 | 3278857 |
We can see from the output that there are actually two different plans in the STS now, one with plan_hash_value=3827183161 and another one with plan_hash_value=4026264003.
In my case I wanted only the one with plan_hash_value=3827183161.
3. Finallly, load the contents of your STS into your SMB:
VARIABLE cnt NUMBER
EXECUTE :cnt := DBMS_SPM.LOAD_PLANS_FROM_SQLSET( -
sqlset_name=>'mysts', basic_filter=>'plan_hash_value=3827183161', sqlset_owner=>'SYS');
print :cnt;
No comments:
Post a Comment