sql >> Base de Datos >  >> RDS >> Oracle

Principales consultas útiles de AWR para la actualización R12.2/R12.1

R12.1/R12.2 son actualizaciones bastante grandes y lentas. Necesitamos encontrar todo el sql de ejecución prolongada para resolver los problemas de rendimiento de la actualización R12.2. Dado que cada iteración lleva mucho tiempo, es importante que intentemos encontrar los problemas de rendimiento en menos iteraciones y solucionarlos en consecuencia

Estas son las principales consultas útiles de AWR para resolver los problemas de rendimiento de la actualización R12.2

Si el SQL todavía está en la memoria (caché del cursor), se puede usar lo siguiente para identificar los SQL de ejecución prolongada que es posible que aún no se hayan escrito en el AWR (en la última instantánea)

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;

La siguiente secuencia de comandos SQL informará el SQL de mayor ejecución entre dos instantáneas de 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;

Donde &begin_snap y &end_snap son los ID de la instantánea inicial y final.
El resultado de esta declaración será similar al siguiente:

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:El tiempo transcurrido es el tiempo máximo transcurrido para todos los trabajadores de un trabajo.

Enterprise Manager también se puede usar para identificar SQL costoso en el momento en que ocurre.

Obtener informe de cursor de visualización para SQL de ejecución prolongada

Para esto,  STATISTICS_LEVEL=ALL y _rowsource_execution_statistics =TRUE. Debe ejecutarse sin ningún retraso para obtener toda la información, ya que, de lo contrario, esta información se eliminará de 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; 

Si el SQL ya no está en la memoria, pero está en el AWR, use el informe Mostrar AWR en su lugar:

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:tenga en cuenta que el informe Mostrar AWR (DBMS_XPLAN.DISPLAY_AWR) no informa sobre los datos reales:no tiene una opción +ALLSTATS y no hay estadísticas reales para los pasos del plan de ejecución almacenados en AWR

Nota importante:el cursor de visualización y los informes AWR solo muestran el texto_sql (los primeros 1000 caracteres) y no el texto_completo. Entonces, si es necesario, ejecute el siguiente script SQL para obtener el texto 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;  

Obtenga el informe de SQL Monitor para SQL usando consultas paralelas/DML

La principal ventaja de esto es que ofrece una buena vista de cómo funciona el SQL/DML paralelo en las etapas del plan y los esclavos paralelos

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  

Donde &begin_snap y &end_snap y son los ID de instantánea de inicio y fin.

Cómo saber cuándo se ejecutó el sql en particular

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;

Donde &begin_snap y &end_snap son los ID de la instantánea inicial y final.
El resultado de esta declaración será similar al siguiente:

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

Cómo encontrar las estadísticas de CBO en 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; 

El resultado de esta declaración será similar al siguiente:

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

Cómo obtener los informes AWR después de la actualización

Se pueden obtener informes de AWR para
• Todo el período de ejecución de la actualización.
• Para la duración de los trabajos de ejecución prolongada (es decir, entre las instantáneas tomadas justo antes de que comience el trabajo y justo después de que finalice) .
• Cada instantánea individual.

Cómo generar los informes AWR
(1) Vaya a $ORACLE_HOME/rdbms/admin
(2) Ejecute awrrpt.sql para generar los informes AWR.
(3) Elija siempre el tipo de informe HTML.
(4) En una instancia de Oracle RAC, awrrpti.sql suele ser suficiente, ya que la actualización se ejecutará solo en un nodo de Oracle RAC.
Los informes de AWR se pueden automatizar. Esto es útil si se produce una gran cantidad de informes AWR, especialmente para instantáneas sucesivas. Consulte la sección "Automatización de informes de AWR" en el documento de soporte de My Oracle "Diagnóstico de rendimiento con depósito de carga de trabajo automático (documento 1674086.1)".
Tenga en cuenta que algunos objetos fijos y objetos de diccionario (particularmente WRH$_LATCH_CHILDREN, especialmente si o hay un período de retención alto o un intervalo de instantánea corto) habrá crecido significativamente durante la actualización. Por lo tanto, es posible que sea necesario recopilar estadísticas de objetos fijos y diccionarios antes de ejecutar AWR.

Artículos relacionados

Repositorio de carga de trabajo automático
Oracle ASH (Historial de sesión activa)
Ajuste del rendimiento de Oracle
Cómo crear una tarea ADDM y verificar su informe
Cómo encontrar detalles de sesión en la base de datos de Oracle