Applicate Baseline

Ti sei mai trovato in una situazione in cui alcune query di database che si comportava bene all’improvviso ha iniziato a funzionare male?

Molto probabilmente, hai ricondotto la causa a un cambiamento nel piano di esecuzione. Ulteriori analisi potrebbero aver rivelato che il cambiamento delle prestazioni era dovuto all’ottimizzatore appena raccolto statistiche sulle tabelle e sugli indici a cui si fa riferimento in tali interrogazioni. Uno dei tanti metodi per proteggere il piano di esecuzione è utilizzare una linea di base Di seguito spiegheremo come impostare un piano di esecuzione con una baseline avente gia ‘in memoria o avente il piano ottimale prendilo da AWR

Di seguito i dettagli tecnici:
ASSOCIATION BASELINE Pianificare l’esecuzione e la memoria valide

I piani sono validi associati a quelli nella v $ sqlarea:

1) Controlla qualsiasi baseline esistente per 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) Verificare l’esecuzione del 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) piano associativo

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) Verificare il piano associato e l’utilizzo effettivo (la query deve avere una nuova esecuzione in 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 ;

ASSOCIATION BASELINE Piano in esecuzione da AWR

1) Controlla qualsiasi linea di base esistente per sql_id in fase di revisione

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 contrassegnare lo snap_id dove si trova 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) Crea 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 relativo piano di accesso

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) baseline di assegnazione

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) Verificare il piano associato e l’utilizzo effettivo (la query deve avere una nuova esecuzione in 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...

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *