Loading SQL Plans into SPM using AWR

Spesso può esserci bisogno di inserire SQL Plans in SPM ma ciò non è possibile perché la query non è in memoria.
Questa è una semplice procedura per caricare SQL Plans in SPM tramite AWR.
Il primo posso è creare, se non esiste, un STS (SQL Tuning Set).
exec dbms_sqltune.create_sqlset(sqlset_name => ‘1ffbnq9wwkhtz_sqlset_test’,
description => ‘query test’);
Nome e descrizione sono customizzabili. In sqlset_name viene utilizzato sql_id in modo da poter ricordare la query.
Il passo successivo è quello di prendere gli id iniziale e finale dello snapshot. Io preferisco generare il report AWR per assicurarmi che la query sia in esecuzione, ovviamente usando::
SQL> @?/rdbms/admin/awrrpt.sql
per generare il report AWR.
Nell’esempio I miei snap_id sono 5868 e 5869.
Ora posso caricare la query in STS
declare
baseline_ref_cur DBMS_SQLTUNE.SQLSET_CURSOR;
begin
open baseline_ref_cur for
select VALUE(p) from table(
DBMS_SQLTUNE.SELECT_WORKLOAD_REPOSITORY(5868, 5869,
‘sql_id=’||’1ffbnq9wwkhtz’||”,
NULL, NULL, NULL, NULL, NULL, NULL, ‘ALL’)) p;
DBMS_SQLTUNE.LOAD_SQLSET(‘1ffbnq9wwkhtz_sqlset_test’, baseline_ref_cur);
end;
In questo modo inserisco ogni execution plan in STS. Se voglio solo un execution plan (per esempio il migliore) e conosco il valore di hash, posso usare questo::
declare
baseline_ref_cur DBMS_SQLTUNE.SQLSET_CURSOR;
begin
open baseline_ref_cur for
select VALUE(p) from table(
DBMS_SQLTUNE.SELECT_WORKLOAD_REPOSITORY(5868, 5869,
‘sql_id=’||’1ffbnq9wwkhtz’||’ and
plan_hash_value=1705166898′, NULL, NULL, NULL, NULL,
NULL, NULL, ‘ALL’)) p;
DBMS_SQLTUNE.LOAD_SQLSET(‘1ffbnq9wwkhtz_sqlset_test’, baseline_ref_cur);
end;
/
Ora controllo se l’STS è stato creato correttamente:
SELECT NAME,OWNER, CREATED, STATEMENT_COUNT
FROM DBA_SQLSET
WHERE name=’1ffjfq6wychsz_sqlset_test’;
Ora controllo se l’execution plan caricato è corretto:
SELECT *
FROM table(dbms_xplan.display_sqlset(‘1ffbnq9wwkhtz_sqlset_test’,’1ffbnq9wwkhtz’));
Infine controllo quante baseline esistono già:
SELECT count(*)
FROM dba_sql_plan_baselines;
Ora è possibile il caricamento di SPM da STS:
set serveroutput on
declare
my_int pls_integer;
begin
my_int := dbms_spm.load_plans_from_sqlset (
sqlset_name => ‘1ffbnq9wwkhtz_sqlset_test’,
sqlset_owner => ‘SYS’,
fixed => ‘YES’,
enabled => ‘YES’);
DBMS_OUTPUT.PUT_line(my_int);
end;
/
Con il parametro FIXED=’YES’ posso correggere un preciso execution plan. Se voglio caricare alcuni plan ma non tutti posso usare il parametro basic_filter (per esempio: basic_filter => ‘sql_id=”1ffbnq9wwkhtz” and plan_hash_value =1705166898′).
Infine, controllo tramite dba_sql_pan_baseline se il caricamento è andato a buon fine:
SELECT SQL_HANDLE, PLAN_NAME, SQL_TEXT, ORIGIN, ENABLED, ACCEPTED,
FIXED, MODULE, AUTOPURGE
FROM DBA_SQL_PLAN_BASELINES;

Potrebbero interessarti anche...