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