SQL TUNING di una istruzione sql
Il tuning task su una istruzione sql si chiama anche "SQL Tuning Advisor (STA)" ed analizza solo una singola sql statement e fornisce raccomandazioni come migliorare le performance.
************************************
1) Creare il tuning task
************************************
SET SERVEROUTPUT ONDECLARE
l_sql_tune_task_id VARCHAR2(100);
BEGIN
l_sql_tune_task_id := DBMS_SQLTUNE.create_tuning_task (
begin_snap => 8901,
end_snap => 8902,
sql_id => 'af9kfdyxuj6aj',
scope => DBMS_SQLTUNE.scope_comprehensive,
time_limit => 1200,
task_name => 'MY_tuning_af9kfdyxuj6aj',
description => 'Tuning per lo statement af9kfdyxuj6aj');
DBMS_OUTPUT.put_line('l_sql_tune_task_id: ' || l_sql_tune_task_id);
END;
/
Usare "snap_id" degli AWR che puoi estarre lanciando lo script awrrpt.sql negli snapid corrispondenti al lasso di tempo in cui quella istruzione è stato eseguita.
Per estrarre gli snap_idfai
SQL> exec dbms_workload_repository.create_snapshot;
SQL> lanciare la query da analizzare
e rifai
SQL> exec dbms_workload_repository.create_snapshot;
e poi devi lanciare awrrpt e vedere gli snap_id.
cd $ORACLE_HOME/rdbms/admin
SQL> sqlplus system/password@$ORACLE_SID @awrrpt.sql
Ricavare anche sql_id dal AWR prodotto prima
oppure ad esempio dalla query
SQL> select *--sql_id,sql_fulltext
from v$sql where sql_text like '% "GAPA_RESPINTIKO"%';
from v$sql where sql_text like '% "GAPA_RESPINTIKO"%';
In "task_name" metti un nome a tuo piacimento tipo MY_tuning_af9kfdyxuj6aj
Dalla seguente query verifichiamo che il task e' stato creato ed e' in stato INITIAL
SQL> SELECT task_name, status
SQL> SELECT task_name, status
FROM dba_advisor_log
where task_name='MY_tuning_af9kfdyxuj6aj';
********************************
2) Eseguire il tuning task
********************************
EXEC DBMS_SQLTUNE.execute_tuning_task(task_name => 'MY_tuning_af9kfdyxuj6aj');
Dalla seguente query verifichiamo lo stato del task.
SQL> SELECT task_name, status
FROM dba_advisor_log
where task_name='MY_tuning_af9kfdyxuj6aj';
*******************************
*******************************
3) Creare il Report
*******************************
Quando ti dà status COMPLETED puoi creare il report contenente le raccomandazioni.
SET LONG 100000000;
SET PAGESIZE 1000
SET LINESIZE 200
SET PAGESIZE 24
SELECT DBMS_SQLTUNE.report_tuning_task('MY_tuning_af9kfdyxuj6aj') AS recommendations FROM dual;
Quando ti dà status COMPLETED puoi creare il report contenente le raccomandazioni.
SET LONG 100000000;
SET PAGESIZE 1000
SET LINESIZE 200
SET PAGESIZE 24
SELECT DBMS_SQLTUNE.report_tuning_task('MY_tuning_af9kfdyxuj6aj') AS recommendations FROM dual;
Il file prodotto ha l'indicazione dei valori della BIND VARIABLE.
GENERAL INFORMATION SECTION
---------------------------------------------------------------------
Tuning Task Name : PROS_tuning_96qmpqqjaf2d4
Tuning Task Owner : SYS
Workload Type : Single SQL Statement
Scope : COMPREHENSIVE
Time Limit(seconds): 1200
Completion Status : COMPLETED
Started at : 06/18/2021 14:19:50
Completed at : 06/18/2021 14:20:32
---------------------------------------------------------------------
Schema Name: PROLLO
SQL ID : 96qmpqqjaf2d4
SQL Text : INSERT into UPINT_PRO (utente, prog_doc, prog_movi) (
SELECT 162400492756016, PROG_DOC, PROG_MOVI FROM
UP0_MOVI WHERE DATA_MOVI >= TRUNC(DECODE(TO_CHAR(SYSDATE - 3,
'D'), '7', SYSDATE - 3 - 1, '1', SYSDATE - 3 - 2, SYSDATE - 3)).......................
................................
Bind Variables :
1 - (VARCHAR2(32)):MIKE
2 - (VARCHAR2(32)):FRANK
3 - (VARCHAR2(32)):287455
4 - (VARCHAR2(32)):287455
......................