Oracle
 sql >> Database >  >> RDS >> Oracle

Principali query utili AWR per l'aggiornamento R12.2/R12.1

R12.1/R12.2 sono piuttosto grandi e richiedono molto tempo per l'aggiornamento. Dobbiamo trovare tutto l'sql di lunga durata per risolvere i problemi di prestazioni dell'aggiornamento a  R12.2. Poiché ogni iterazione richiede molto tempo, è importante, abbiamo cercato di scoprire i problemi di prestazioni in meno iterazioni e di risolverli di conseguenza

Ecco le principali query utili di AWR per risolvere problemi di prestazioni dell'aggiornamento a R12.2

Se l'SQL è ancora in memoria (cache del cursore), è possibile utilizzare quanto segue per identificare gli SQL di lunga durata che potrebbero non essere stati ancora scritti nell'AWR (all'ultimo snapshot)

SELECT * FROM
 (SELECT
 ss.sql_id,
 ROUND(SUM(ss.elapsed_time/1000000),0) elapsed_time_secs,
 ROUND(SUM(ss.cpu_time/1000000),0) cpu_time_secs,
 SUM(ss.disk_reads) disk_reads,
 SUM(ss.direct_writes) direct_writes,
 SUM(ss.buffer_gets) buffer_gets,
 SUM(ss.px_servers_executions) px_server_execs,
 SUM(ss.rows_processed) rows_processed,
 SUM(ss.executions) executions,
 SUM(ss.application_wait_time) apwait_secs,
 SUM(ss.sharable_mem) sharable_mem,
 SUM(ss.total_sharable_mem) total_sharable_mem
 FROM v$sqlstats ss
 GROUP BY ss.sql_id
 ORDER BY 2 DESC)
 WHERE ROWNUM <= 100;

Il seguente script SQL riporterà l'SQL più lungo tra due snapshot AWR

SELECT * FROM 
 (SELECT
 dhs.sql_id,
 ROUND(SUM(dhs.elapsed_time_delta/1000000),0) elapsed_time_secs,
 ROUND(SUM(dhs.cpu_time_delta/1000000),0) cpu_time_secs,
 SUM(dhs.disk_reads_delta) disk_reads,
 SUM(dhs.buffer_gets_delta) buffer_gets,
 SUM(dhs.px_servers_execs_delta) px_server_execs,
 SUM(dhs.rows_processed_delta) rows_processed,
 SUM(dhs.executions_delta) executions,
 ROUND(SUM(dhs.iowait_delta/1000000),0) iowait_secs,
 ROUND(SUM(dhs.clwait_delta/1000000),0) clwait_secs,
 ROUND(SUM(dhs.ccwait_delta/1000000),0) ccwait_secs,
 ROUND(SUM(dhs.apwait_delta/1000000),0) apwait_secs
 FROM dba_hist_sqlstat dhs
 ,v$database d
 WHERE dhs.dbid = d.dbid
 AND snap_id > &begin_snap   and snap_id <= &end_snap
 GROUP BY dhs.sql_id
 ORDER BY 2 DESC)
 WHERE ROWNUM <= 100;

Dove &begin_snap e &end_snap sono gli ID snapshot di inizio e fine.
L'output di questa istruzione sarà simile al seguente:

SQL_ID ELAPSED_TIME_SECS CPU_TIME_SECS DISK_READS BUFFER_GETS….
 ------------- ----------------- --------------- ---------- ----------- ….
 5vaxut40xbrmr 367440 42999 34838244 3795838289 ….
 943ra4b7zg28x 264369 170788 441127 562033013 ….
 fkkrk9frwqfdr 70370 6448 3599284 469639133 ….
 4847s6dt6sds9 68298 38896 7125573 1327384554 ….
 2k3uw8n473r30 63600 27402 20043712 587615960 ….

Nota:il tempo trascorso è il tempo massimo trascorso per tutti i lavoratori di un lavoro.

Enterprise Manager può essere utilizzato anche per identificare il costoso SQL quando si presenta.

Ottieni il rapporto del cursore di visualizzazione per SQL a esecuzione prolungata

Per questo  STATISTICS_LEVEL=ALL e _rowsource_execution_statistics =TRUE. Dovrebbe essere eseguito senza alcun ritardo per ottenere tutte le informazioni, altrimenti queste informazioni verranno eliminate da SGA

SET pages 0 
SET lines 300 
SET LONG 10000
SET LONGCHUNKSIZE 10000 
SPOOL <report>.txt 
SELECT * FROM TABLE(dbms_xplan.display_cursor('<SQL ID>', NULL, 'ALL +ALLSTATS')); 
 SPOOL OFF; 

Se l'SQL non è più in memoria, ma si trova nell'AWR, utilizzare invece il report Visualizza AWR:

SET pages 0 
SET lines 300 
SET LONG 10000 
SET LONGCHUNKSIZE 10000 
SPOOL .txt 
SELECT * FROM TABLE(dbms_xplan.display_awr('<SQL ID>', NULL, NULL, 'ALL')); 
SPOOL OFF; 

Nota:Tieni presente che il report Visualizza AWR (DBMS_XPLAN.DISPLAY_AWR) non riporta i dati effettivi:non ha un'opzione +ALLSTATS e non ci sono statistiche effettive per i passaggi del piano di esecuzione archiviati in AWR

Nota importante:il cursore di visualizzazione e i rapporti AWR mostrano solo sql_text (primi 1000 caratteri) e non sql_fulltext. Quindi, se necessario, esegui il seguente script SQL per ottenere il testo SQL completo

SET pages 0 
SET lines 300 
SET LONG 10000 
SET LONGCHUNKSIZE 10000 
SPOOL<report_name>.txt 
SELECT sql_id, sql_text, sql_fulltext FROM v$SQL 
WHERE sql_id = '<sql_id>'; 
SPOOL OFF;  

Ottieni report SQL Monitor per SQL utilizzando query parallela/DML

Il vantaggio principale di questo è che offre una buona visione delle prestazioni di SQL/DML parallelo tra le fasi del piano e gli slave paralleli

set trimspool on 
set trim on 
set pages 0 
set long 10000000 
set long chunksize 10000000 
set linesize 200 
set termout off 
spool sql_monitor_for_<sql_id>.htm 
variable my_rept CLOB; 
BEGIN :my_rept := dbms_sqltune.report_sql_monitor(sql_id => '<sql_id>', report_level => 'ALL', type => 'HTML'); 
END; 
/ 
print :my_rept spool off; 
set termout on  

Dove &begin_snap e &end_snap e sono gli ID snapshot di inizio e fine.

Come scoprire quando è stato eseguito il particolare sql

SELECT 
 dhs.sql_id, 
 dsn.snap_id, 
 dsn.begin_interval_time, 
 dsn.end_interval_time, 
 ROUND(SUM(dhs.elapsed_time_delta/1000000),0) elapsed_time_secs 
 FROM dba_hist_sqlstat dhs 
 ,v$database d ,dba_hist_snapshot dsn 
 WHERE dhs.dbid = d.dbid
 AND dsn.snap_id = dhs.snap_id 
 AND dsn.dbid = dhs.dbid
 AND dsn.instance_number = dhs.instance_number AND dhs.sql_id = '<SQL ID>' 
 AND dsn.snap_id > &begin_snap  and dsn.snap_id <= &end_snap
 GROUP BY dhs.sql_id, dsn.snap_id, dsn.begin_interval_time, dsn.end_interval_time 
 ORDER BY dsn.snap_id;

Dove &begin_snap e &end_snap sono gli ID snapshot di inizio e fine.
L'output di questa istruzione sarà simile al seguente:

SQL_ID SNAP_ID BEGIN_INTERVAL_TIME END_INTERVAL_TIME ELAPSED_TIME_SECS
 
 2k3uw8n473r30 8278 04-JAN-13 23.00.25.5560 05-JAN-13 00.00.21.1620 23123
 2k3uw8n473r30 8279 05-JAN-13 00.00.21.1620 05-JAN-13 01.00.38.2680 37145

Come trovare le statistiche CBO su Ebiz Environment

SELECT owner, table_name, num_rows, TO_CHAR(last_analyzed,'DD-MON-YYYY HH24:MI:SS') last_analyzed 
 FROM all_tables
 WHERE owner IN 
 (SELECT upper(oracle_username) sname
 FROM fnd_oracle_userid 
 WHERE oracle_id BETWEEN 900 AND 999
 AND read_only_flag = 'U' 
 UNION ALL
 SELECT DISTINCT upper(oracle_username) sname 
 FROM fnd_oracle_userid a,fnd_product_installations b
 WHERE a.oracle_id = b.oracle_id 
 )
 ORDER BY owner, table_name; 

L'output di questa istruzione sarà simile al seguente:

OWNER TABLE_NAME NUM_ROWS LAST_ANALYZED
 --- ---------    ---------- ------------------------
 ABM ABM_ACC_MAP_SUM_REP 0 06-DEC-2016 08:46:33
 ABM ABM_ACT_ACC_RU_DAT 0 06-DEC-2016 08:46:35
 ABM ABM_ACT_STA_RU_DAT 0 06-DEC-2016 08:46:36

Come ottenere i rapporti AWR dopo l'aggiornamento

I rapporti AWR  possono essere ottenuti per
• Per l'intero periodo di esecuzione dell'aggiornamento.
• Per la durata dei lavori di lunga durata (ovvero tra gli snapshot presi appena prima dell'inizio del lavoro e subito dopo il suo completamento) .
• Ogni singola istantanea.

Come generare i rapporti AWR
(1) Vai a $ORACLE_HOME/rdbms/admin
(2) Esegui awrrpt.sql genera i rapporti AWR.
(3) Scegli sempre il tipo di rapporto HTML.
(4) In un'istanza Oracle RAC, awrrpti.sql è generalmente sufficiente, poiché l'aggiornamento verrà eseguito solo su un nodo Oracle RAC.
I report AWR possono essere automatizzati. Ciò è utile se si producono un numero elevato di rapporti AWR, in particolare per istantanee successive. Vedere la sezione "Automating AWR Reports" nel documento My Oracle Support "Diagnosi delle prestazioni con il repository automatico del carico di lavoro (Documento 1674086.1)". o c'è un periodo di conservazione elevato o un breve intervallo di snapshot) saranno aumentati in modo significativo durante l'aggiornamento. Pertanto, prima di eseguire AWR, potrebbe essere necessario raccogliere statistiche sugli oggetti fissi e sul dizionario.

Articoli correlati

Repository automatico del carico di lavoro
Oracle ASH(Active Session History)
Oracle Performance Tuning
Come creare un'attività ADDM e controllarne il rapporto
Come trovare i dettagli della sessione nel database Oracle