Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Principais consultas úteis do AWR para atualização R12.2/R12.1


R12.1/R12.2 são atualizações muito grandes e demoradas. Precisamos encontrar todo o sql de longa execução para resolver os problemas de desempenho de atualização do  R12.2. Como cada iteração leva muito tempo, é importante tentar descobrir os problemas de desempenho em menos iterações e corrigi-los de acordo

Aqui estão as principais consultas úteis do AWR para resolver problemas de desempenho de upgrade do R12.2

Se o SQL ainda estiver na memória (cache de cursor), o seguinte pode ser usado para identificar SQLs de longa execução que podem não ter sido gravados no AWR ainda (no último instantâneo)
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) execuções, 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;

O script SQL a seguir relatará o SQL de execução mais longa entre dois instantâneos do 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) execuções, ROUND(SUM(dhs.iowait_delta/1000000),0) iowait_secs, ROUND(SUM(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 e snap_id <=&end_snap GROUP BY dhs.sql_id ORDER BY 2 DESC) WHERE ROWNUM <=100;

Onde &begin_snap e &end_snap são os IDs de snapshot inicial e final.
A saída dessa instrução será semelhante à seguinte:
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:O tempo decorrido é o tempo máximo decorrido para todos os trabalhadores de um trabalho.

O Enterprise Manager também pode ser usado para identificar SQL caro à medida que ocorre.

Obter relatório de cursor de exibição para SQL de longa duração

Para isso  STATISTICS_LEVEL=ALL e _rowsource_execution_statistics =TRUE. Ele deve ser executado sem qualquer  atraso para obter todas as informações, caso contrário, essas informações serão eliminadas do SGA
SET páginas 0 SET linhas 300 SET LONG 10000SET LONGCHUNKSIZE 10000 SPOOL .txt SELECT * FROM TABLE(dbms_xplan.display_cursor('', NULL, 'ALL +ALLSTATS')); CARRETEL DESLIGADO; 

Se o SQL não estiver mais na memória, mas estiver no AWR, use o relatório Exibir AWR:
SET páginas 0 SET linhas 300 SET LONG 10000 SET LONGCHUNKSIZE 10000 SPOOL .txt SELECT * FROM TABLE(dbms_xplan.display_awr('', NULL, NULL, 'ALL')); CARRETEL DESLIGADO; 

Nota:Esteja ciente de que o relatório Exibir AWR (DBMS_XPLAN.DISPLAY_AWR) não informa os dados reais:ele não tem uma opção +ALLSTATS e não há estatísticas reais para as etapas do plano de execução armazenadas no AWR

Observação importante:o cursor de exibição e os relatórios AWR mostram apenas o sql_text (primeiros 1000 caracteres) e não o sql_fulltext. Portanto, se necessário, execute o seguinte script SQL para obter o texto SQL completo
SET pages 0 SET lines 300 SET LONG 10000 SET LONGCHUNKSIZE 10000 SPOOL.txt SELECT sql_id, sql_text, sql_fulltext FROM v$SQL WHERE sql_id =''; CARRETEL DESLIGADO; 

Obter o relatório do SQL Monitor para SQL usando consulta paralela/DML

A principal vantagem disso é que ele fornece uma boa visão de como o SQL/DML paralelo funciona entre os estágios do plano e escravos paralelos
definir trimspool em definir trim em páginas definidas 0 definir longo 10000000 definir tamanho de bloco longo 10000000 definir tamanho de linha 200 definir termoout off spool sql_monitor_for_.htm variável my_rept CLOB; BEGIN :my_rept :=dbms_sqltune.report_sql_monitor(sql_id => '', report_level => 'ALL', type => 'HTML'); FIM; / print :my_rept spool off; definir termo em 

Onde &begin_snap e &end_snap e são os IDs de snapshot inicial e final.

Como descobrir quando o sql específico foi executado
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 ,dhs.dbid =snapshot dsn WHERE 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 ='' AND dsn.snap_id> &begin_snap e 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;

Onde &begin_snap e &end_snap são os IDs de snapshot inicial e final.
A saída desta instrução será semelhante à seguinte:
 sql_id SNAP_ID BEGN_INTERVAL_TIME ENINTAL_TIMEL_SELAPED_TIME_SECS 2K3UW8N473R30 8278 04-JAN-JAN -3 23.00.25.5560 05-JAN-13 00.00.21.1620 23123 2K3UW8N473 
Como encontrar as estatísticas do CBO no ambiente Ebiz
SELECT proprietário, 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 proprietário, table_name; 

A saída desta instrução será semelhante à seguinte:
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

Como obter os relatórios do AWR após o upgrade

Relatórios de AWR  podem ser obtidos para
• Todo o período em que o upgrade está em execução.
• Para a duração de trabalhos de longa duração (ou seja, entre os instantâneos tirados pouco antes do início do trabalho e logo após o término) .
• Cada instantâneo individual.

Como gerar os relatórios AWR
(1) Vá para $ORACLE_HOME/rdbms/admin
(2) Execute awrrpt.sql gere os relatórios AWR.
(3) Sempre escolha o tipo de relatório HTML.
(4) Em uma instância Oracle RAC, awrrpti.sql geralmente será suficiente, pois a atualização será executada apenas em um nó Oracle RAC.
Os relatórios AWR podem ser automatizados. Isso é útil ao produzir um grande número de relatórios AWR, principalmente para instantâneos sucessivos. Consulte a seção “Automating AWR Reports” no documento do My Oracle Support “Performance Diagnosis with Automatic Workload Repository (Documento 1674086.1)”.
Observe que alguns objetos fixos e objetos de dicionário (particularmente WRH$_LATCH_CHILDREN, especialmente se statistics_level =ALL, ou há um alto período de retenção ou um curto intervalo de captura instantânea) terá crescido significativamente durante a atualização. Portanto, estatísticas de objetos fixos e dicionários podem precisar ser reunidas antes de executar AWRs.

Artigos relacionados

Repositório Automático de Carga de Trabalho
Oracle ASH(Active Session History)
Oracle Performance Tuning
Como criar uma tarefa ADDM e verificar seu relatório
Como encontrar detalhes da sessão no banco de dados Oracle