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