Applicare Baseline

Sei mai stato in una situazione in cui alcune query sul database cambiano improvvisamente le performance?
Questo causa, nella maggior parte di casi, è rintracciata ad un cambiamento nel piano di esecuzione.
Ulteriori analisi hanno rivelato la variazione delle prestazioni nella maggior parte dei casi è dovuta alla recente raccolta di
statistiche sulle tabelle e indici di cui ai suddetti quesiti.
Uno dei molti metodi per fissare il piano di esecuzione è quello di utilizzare una baseline
Qui sotto spiegheremo come fissare un piano di esecuzione con una baseline avendo gia’ il piano ottimale in memoria o dovendo prenderlo dagli AWR
Qui sotto il dettaglio tecnico:
********** ASSOCIAZIONE BASELINE Piano esecuzione valido e in memoria **********
I piani validi associabili sono quelli contenuti nella v$sqlarea:
1) Verifica eventuali baseline già presenti per il sql_id in esame
SELECT sql_handle, plan_name FROM dba_sql_plan_baselines WHERE signature IN ( SELECT exact_matching_signature FROM v$sql WHERE sql_id=’&sql_id’) ;
2) Verifica piano
set lines 222
select INST_ID,sql_id,plan_hash_value,ELAPSED_TIME/executions, executions,SQL_PLAN_BASELINE,FIRST_LOAD_TIME,LAST_ACTIVE_TIME
from gv$sql where sql_id in (‘&sql_id’) order by 2,8 desc ;
3) Associazione piano
DECLARE
my_plans pls_integer;
BEGIN
my_plans := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(
sql_id => ‘&sql_id’,
PLAN_HASH_VALUE =>&pianoEsecuzione,
FIXED =>’YES’);
dbms_output.put_line(‘Value is ‘||my_plans);
END;
/
4) Verifica piano associato e effettivo utilizzo ( la query deve avere una nuova esecuzione nella v$sql )
select s.sql_id, b.plan_name, b.origin, b.accepted, b.enabled, b.fixed
from dba_sql_plan_baselines b, v$sql s
where s.exact_matching_signature = b.signature and s.sql_plan_baseline = b.plan_name and s.sql_id=’&sql_id’;
select INST_ID,sql_id,plan_hash_value,ELAPSED_TIME/executions, executions,SQL_PLAN_BASELINE,FIRST_LOAD_TIME,LAST_ACTIVE_TIME
from gv$sql where sql_id in (‘&sql_id’) order by 2,8 desc ;
********** ASSOCIAZIONE BASELINE Piano esecuzione da AWR **********
1) Verifica eventuali baseline già presenti per il sql_id in esame
SELECT sql_handle, plan_name FROM dba_sql_plan_baselines
WHERE signature IN ( SELECT exact_matching_signature FROM v$sql WHERE sql_id=’&sql_id’) ;
2) Individuare la query con cambio di piano e segnarsi lo snap_id in cui è presente il piano ottimale
set pages 500
set lines 220
select SNAP_ID,SQL_ID,PLAN_HASH_VALUE,OPTIMIZER_COST,SQL_PROFILE from DBA_HIST_SQLSTAT where sql_id = ‘&sql_id’ order by snap_id;
3) Creazione SQLSET
exec dbms_sqltune.create_sqlset(sqlset_name => ‘&sql_id’||’_sqlset’,description => ‘Query baseline’);
4) Assegnazione SQLSET
declare
baseline_ref_cur DBMS_SQLTUNE.SQLSET_CURSOR;
begin
open baseline_ref_cur for
select VALUE(p) from table(
DBMS_SQLTUNE.SELECT_WORKLOAD_REPOSITORY(&snap_id_inizio, &snap_id_fine,’sql_id=’||CHR(39)||’&sql_id’||CHR(39)||”,NULL,NULL,NULL,NULL,NULL,NULL,’ALL’)) p;
DBMS_SQLTUNE.LOAD_SQLSET(‘&sql_id’||’_sqlset’, baseline_ref_cur);
end;
/
5) Verifica SQLSET e piano d’accesso correlato
SELECT NAME,OWNER,CREATED,STATEMENT_COUNT FROM DBA_SQLSET where name=’&sql_id’||’_sqlset’;
select * from table(dbms_xplan.display_sqlset(‘&sql_id’||’_sqlset’,’&sql_id’));
6) Assegnazione baseline
set serveroutput on
declare
my_int pls_integer;
begin
my_int := dbms_spm.load_plans_from_sqlset (
sqlset_name => ‘&sql_id’||’_sqlset’,
sqlset_owner => ‘SYS’,
fixed => ‘YES’,
enabled => ‘YES’);
DBMS_OUTPUT.PUT_line(my_int);
end;
/
7) Verifica piano associato e effettivo utilizzo ( la query deve avere una nuova esecuzione nella v$sql )
select s.sql_id, b.plan_name, b.origin, b.accepted, b.enabled, b.fixed
from dba_sql_plan_baselines b, v$sql s
where s.exact_matching_signature = b.signature and s.sql_plan_baseline = b.plan_name and s.sql_id=’&sql_id’;
select INST_ID,sql_id,plan_hash_value,ELAPSED_TIME/executions, executions,SQL_PLAN_BASELINE,FIRST_LOAD_TIME,LAST_ACTIVE_TIME
from gv$sql where sql_id in (‘&sql_id’) order by 2,8 desc ;

Potrebbero interessarti anche...