Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Die wichtigsten nützlichen AWR-Abfragen für das R12.2/R12.1-Upgrade

R12.1/R12.2 sind ziemlich große und zeitaufwändige Upgrades. Wir müssen alle lang laufenden SQLs finden, um die Leistungsprobleme des R12.2-Upgrades zu lösen. Da jede Iteration viel Zeit in Anspruch nimmt, ist es wichtig, dass wir versucht haben, die Leistungsprobleme in weniger Iterationen herauszufinden und sie entsprechend zu beheben

Hier sind die wichtigsten AWR-Abfragen zur Lösung von Leistungsproblemen bei R12.2-Upgrades

Wenn sich SQL noch im Speicher (Cursor-Cache) befindet, kann Folgendes verwendet werden, um lange laufende SQLs zu identifizieren, die möglicherweise noch nicht in das AWR geschrieben wurden (beim letzten 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;

Das folgende SQL-Skript meldet die am längsten laufende SQL zwischen zwei AWR-Snapshots

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;

Wobei &begin_snap und &end_snap die Start- und End-Snapshot-IDs sind.
Die Ausgabe dieser Anweisung sieht etwa so aus:

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 ….

Hinweis:Die verstrichene Zeit ist die maximal verstrichene Zeit für alle Arbeiter eines Jobs.

Enterprise Manager kann auch verwendet werden, um teures SQL zu identifizieren, sobald es auftritt.

Anzeige-Cursor-Bericht für SQL mit langer Ausführung abrufen

Dafür  STATISTICS_LEVEL=ALL und _rowsource_execution_statistics =TRUE. Es sollte ohne Verzögerung ausgeführt werden, um alle Informationen zu erhalten, da diese Informationen sonst aus SGA gelöscht werden

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; 

Wenn sich das SQL nicht mehr im Arbeitsspeicher, aber im AWR befindet, verwenden Sie stattdessen den Bericht AWR anzeigen:

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; 

Hinweis:Beachten Sie, dass der Bericht AWR anzeigen (DBMS_XPLAN.DISPLAY_AWR) keine Ist-Werte ausgibt:Er verfügt nicht über die Option +ALLSTATS, und es gibt keine Ist-Statistiken für Ausführungsplanschritte, die in AWR

gespeichert sind

Wichtiger Hinweis:Der Anzeigecursor und die AWR-Berichte zeigen nur den sql_text (die ersten 1000 Zeichen) und nicht den sql_fulltext. Führen Sie daher bei Bedarf das folgende SQL-Skript aus, um den vollständigen SQL-Text abzurufen

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;  

SQL-Monitorbericht für SQL mit paralleler Abfrage/DML abrufen

Der Hauptvorteil davon ist, dass es einen guten Überblick darüber gibt, wie sich paralleles SQL/DML über die Phasen des Plans und parallele Slaves hinweg verhält

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  

Wobei &begin_snap und &end_snap und die Start- und End-Snapshot-IDs sind.

Wie man herausfindet, wann die jeweilige SQL ausgeführt wurde

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;

Wobei &begin_snap und &end_snap die Start- und End-Snapshot-IDs sind.
Die Ausgabe dieser Anweisung sieht etwa so aus:

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

So finden Sie die CBO-Statistiken in 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; 

Die Ausgabe dieser Anweisung sieht etwa so aus:

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

So erhalten Sie die AWR-Berichte nach dem Upgrade

AWR-Berichte können abgerufen werden für
• den gesamten Zeitraum, in dem das Upgrade ausgeführt wird.
• Für die Dauer lang andauernder Jobs (d. h. zwischen den Snapshots, die kurz vor dem Start des Jobs und kurz nach dessen Ende erstellt wurden). .
• Jeder einzelne Schnappschuss.

So generieren Sie die AWR-Berichte
(1) Gehen Sie zu $ORACLE_HOME/rdbms/admin
(2) Führen Sie awrrpt.sql aus, um die AWR-Berichte zu generieren.
(3) Wählen Sie immer den HTML-Berichtstyp.
(4) Auf einer Oracle RAC-Instanz reicht normalerweise awrrpti.sql aus, da das Upgrade nur auf einem Oracle RAC-Knoten ausgeführt wird.
AWR-Berichte können automatisiert werden. Dies ist nützlich, wenn Sie eine große Anzahl von AWR-Berichten erstellen, insbesondere für aufeinanderfolgende Snapshots. Siehe den Abschnitt „Automating AWR Reports“ im My Oracle Support-Dokument „Performance Diagnosis with Automatic Workload Repository (Document 1674086.1)“.
Beachten Sie, dass einige feste Objekte und Wörterbuchobjekte (insbesondere WRH$_LATCH_CHILDREN, besonders wenn oder es gibt einen langen Aufbewahrungszeitraum oder ein kurzes Snapshot-Intervall) während des Upgrades erheblich gewachsen sind. Daher müssen vor dem Ausführen von AWRs möglicherweise feste Objekt- und Wörterbuchstatistiken gesammelt werden.

Verwandte Artikel

Automatic Workload Repository
Oracle ASH (Active Session History)
Oracle Performance Tuning
So erstellen Sie eine ADDM-Aufgabe und überprüfen ihren Bericht
So finden Sie Sitzungsdetails in der Oracle-Datenbank