Pular para o conteúdo
  • Este tópico contém 8 respostas, 3 vozes e foi atualizado pela última vez 15 anos, 6 meses atrás por jspaulonci.
Visualizando 9 posts - 1 até 9 (de 9 do total)
  • Autor
    Posts
  • #95699
    mpvargas
    Participante

      Caros Amigos,
      Hoje um analista colocou um processo que ele imaginou ser rápido e demorou mais de 3 horas…
      O gerente me perguntou, durante o processo, o que estava sendo feito e se eu sabia quanto tempo ia demorar…
      Eu respondi que sabia o que estava sendo executado, mas nao sabia o que “tinha” sido executado e nem quanto tempo levaria…
      Perguntou a vocês.
      É possível acompanhar um processo pelo banco, e ver o que foi feito?
      É possível saber quanto tempo vai demorar um determinado processo?
      Obrigado pela ajuda.

      #95700
      mpvargas
      Participante

        Complementando…

        Essa sessão estava apresentando na maior parte do tempo o Evento de Espera “FREE BUFFER WAITS”
        O que eu posso fazer para que isso nao se repita?
        Obrigado

        #95702
        mpvargas
        Participante

          Algumas recomendações do ADDM

          FINDING 2: 66% impact (468 seconds)

          Os database writers (DBWR) não puderam acompanhar a demanda por buffers livres.

          RECOMMENDATION 1: DB Configuration, 66% benefit (468 seconds)
          ACTION: Considere o aumento do número de database writers (DBWR) definindo o parâmetro “db_writer_processes”. Considere também se a E/S assíncrona é apropriada à sua arquitetura.
          RATIONALE: O valor do parâmetro “db_writer_processes” era “1” durante o período de análise.
          RATIONALE: O valor do parâmetro “disk_asynch_io” era “TRUE” durante o período de análise.

          RECOMMENDATION 2: Host Configuration, 66% benefit (468 seconds)
          ACTION: Investigue o desempenho de gravação do subsistema de
          entrada/saída.
          RATIONALE: Durante o período de análise, a média de throughpout de E/S de arquivos de dados era 1 M por segundo para leituras e 1.2 M por segundo para gravações. O tempo médio de resposta para leituras de
          blocos únicos era 9.7 milissegundos.

          RECOMMENDATION 3: Application Analysis, 66% benefit (468 seconds)
          ACTION: Investigue a lógica da aplicação para o possível uso de
          inserções de caminho direto como alternativa para várias operações
          com INSERT.

          SYMPTOMS THAT LED TO THE FINDING:
          SYMPTOM: A classe de espera “Configuração” estava consumindo um tempo de banco de dados significativo. (66% impact [469 seconds])

          #95710
          jspaulonci
          Participante

            Bom dia mpvargas, tome muito cuidado com as recomendações do ADDM, avalie bem e tente testar antes de implementar.

            Quanto a saber o que foi feito é possível através do trace, é possível startar um trace da sessão implicitamente através de um gatilho de sistema, ou explicitamente também, existem várias maneiras de se fazer isso, o trace gerará um arquivo em formato texto, depois disso precisa-se passar um utilitário chamado tkprof para traduzir os comandos.

            Quanto ao que está sendo feito, no momento recomento utilizar a query abaixo, mas ela não está preparada para RAC, se você está em RAC você precisará saber a instância antes rodar essa query.
            select t.address,
            t.piece,
            t.sql_text
            from v$sqltext t
            where t.address in (select a.sql_address from V$session a, v$access b
            where a.sid = b.sid
            and b.sid in (584))
            order by 1,2

            Quanto a quanto tempo vai demorar, também tem jeito sim de estimar, mas eu não sei, se você descobrir por favor post para nós

            #95713
            Sousa04
            Participante

              Utilizo esse script para ver o status atual da Query. Muito bom!!

              SET PAGESIZE 100 WRAP ON
              SPOOL sessinfo.txt

              PROMPT ======================================================================
              PROMPT
              PROMPT Session information for Session ID &1
              SET FEED OFF HEA OFF
              SELECT INITCAP(TO_CHAR(SYSDATE, ‘DD-MON-YYYY HH24:MI:SS’)) ||’ ‘|| name
              FROM v$database
              /
              SET FEED ON HEA ON
              PROMPT
              PROMPT ======================================================================
              PROMPT ======================================================================
              PROMPT v$session – General info
              PROMPT ======================================================================
              col username for a12 HEA “Username”
              SELECT
              SUBSTR(TO_CHAR(s.sid) ||’, ‘|| TO_CHAR(s.serial#), 1, 10) “Sid/Serial#”
              , s.osuser “Osuser”
              , s.username
              , SUBSTR(TO_CHAR(logon_time, ‘HH24:MI:SS’), 1, 8) “Logon”
              , status “Status”
              , p.spid “OS process”
              , s.program “Program”
              , s.module “Module”
              , s.action “Action”
              from v$session s
              , v$process p
              where type = ‘USER’
              and s.paddr = p.addr
              AND s.sid = &1
              /

              PROMPT ======================================================================
              PROMPT v$sql – Current SQL statement this session executes
              PROMPT ======================================================================
              col sql_text for a70 hea “Current SQL”
              select q.sql_text
              from v$session s
              , v$sql q
              WHERE s.sql_address = q.address
              and s.sql_hash_value + DECODE
              (SIGN(s.sql_hash_value)
              , -1, POWER( 2, 32)
              , 0
              ) = q.hash_value
              AND s.sid = &1
              /

              PROMPT ======================================================================
              PROMPT v$transaction – Current transaction of this session
              PROMPT ======================================================================
              col undo_mb for 999.9 hea “Undo Mb”
              col undo_blks for 99999 hea “Undo blocks”
              select r.name “Rollback segment”
              , substr( t.start_time, 10, 5) “Start”
              , t.used_ublk * p.value / (1024*1024) undo_mb
              , t.used_ublk undo_blks
              from v$transaction t
              , v$rollname r
              , v$session s
              , v$parameter p
              where t.addr = s.taddr
              and t.xidusn = r.usn
              and p.name = ‘db_block_size’
              AND s.sid = &1
              /

              PROMPT ======================================================================
              PROMPT v$access – Objects accessed by this session
              PROMPT ======================================================================
              SELECT substr(a.owner,1,30) “Owner”
              , substr(a.object,1,30) “Object Being Accessed”
              from v$access a
              where a.sid = &1
              /

              PROMPT ======================================================================
              PROMPT v$lock – Locks held by this session
              PROMPT ======================================================================
              column LTYPE format a20 heading “Type”
              column LMODE format a13 heading “Mode”
              column LWHAT format a34 heading “Object”
              column LTIME format 99999 heading “Time”
              select decode
              (LCK.type
              , ‘MR’, ‘Media Recovery’
              , ‘RT’, ‘Redo Thread’
              , ‘UN’, ‘User Name’
              , ‘TX’, ‘Transaction’
              , ‘TM’, ‘DML’
              , ‘UL’, ‘PL/SQL User Lock’
              , ‘DX’, ‘Distributes Xaction’
              , ‘CF’, ‘Control File’
              , ‘IS’, ‘Instance State’
              , ‘FS’, ‘File Set’
              , ‘IR’, ‘Instance recovery’
              , ‘ST’, ‘Disk Space Transaction’
              , ‘TS’, ‘Temp Segment’
              , ‘IV’, ‘Library Cache Invalidation’
              , ‘LS’, ‘Log Start or Switch’
              , ‘RW’, ‘Row Wait’
              , ‘SQ’, ‘Sequence Number’
              , ‘TE’, ‘Extend table’
              , ‘TT’, ‘Temp Table’
              , ‘Unknown’
              ) LTYPE
              , decode
              (LCK.lmode
              , 2, ‘Row-S (SS)’
              , 3, ‘Row-X (SX)’
              , 4, ‘Share’
              , 5, ‘S/Row-X (SSX)’
              , 6, ‘Exclusive’
              ) LMODE
              , DO.owner || ‘.’ || DO.object_name LWHAT
              , LCK.ctime LTIME
              from v$lock LCK
              , v$locked_object LO
              , sys.dba_objects DO
              where LCK.lmode in (2, 3, 4, 5, 6)
              and LCK.sid = LO.session_id
              and LO.object_id = DO.object_id
              and LCK.sid = &1
              order by 1
              , 2
              , 3
              /

              PROMPT ======================================================================
              PROMPT v$session – Object this session is waiting for
              PROMPT ======================================================================
              COL owner FOR A15 HEA “Object owner”
              COL object_name FOR A25 HEA “Object name”
              COL session_id HEA “Lock SID”
              COL oracle_username FOR A15 HEA “Lock owner”
              BREAK ON owner ON object_name
              SELECT o.owner, o.object_name, l.session_id, l.oracle_username
              from v$session s
              , dba_objects o
              , v$locked_object l
              WHERE s.sid = &1
              AND s.row_wait_obj# != -1
              AND s.row_wait_obj# = o.object_id
              AND l.object_id = o.object_id
              AND l.session_id != &1
              /
              CL BREAKS
              CL COL

              PROMPT ======================================================================
              PROMPT v$session_wait – Wait statistics for this session
              PROMPT ======================================================================
              col event for a60 hea “Event”
              col wait_time for 999999 hea “Wait time”
              SELECT e.event
              , e.wait_time
              FROM v$session_wait e
              WHERE e.sid = &1
              /

              PROMPT ======================================================================
              PROMPT v$sesstat – System statistics of this session
              PROMPT ======================================================================
              SELECT
              n.statistic# “Statistic#”
              , SUBSTR(n.name,1,50) “Name”
              , s.value “Value”
              FROM v$statname n
              , v$sesstat s
              WHERE s.statistic# = n.statistic#
              AND s.sid = &1
              AND s.value != 0
              /

              SPO OFF
              CL COL
              prompt dados salvos em sessinfo.txt
              undefine 1

              Agora para verificar quanto tempo falta para o processo terminar ou quanto já foi processado, Não faço tbm a mínima idéia. A propósito já me questionaram várias vezes sobre isso. O Vieri deve saber o bicho é cabeção!!! rsrs

              #95714
              Sousa04
              Participante

                Para executar o script

                @/diretório/nomedoscript SID

                vlw

                #95723
                mpvargas
                Participante

                  Companheiros, obrigado pela ajuda.

                  João Paulo, seria possível você me passar mais detalhes sobre o trace?

                  Sousa, esse script que você me passou, eu devo executar ele todo? No caso, a query pega a sessão e usa na outra query ou temos que colocar a sessao manualmente? Fiquei na duvida.

                  PS.: Essa parte do Vieri achei engraçada hehehehe … se ele ler isso vai gostar … Realmente o cara é FERA

                  Abraços a todos

                  #95735
                  Sousa04
                  Participante

                    Coloca o todo o script em um arquivo tipo verificasql.sql

                    dentro do sqlplus vc chama ele passa o sid da sessão que vc quer pegar manualmente mesmo.

                    SQL> @/home/oracle/verificasql.sql 137

                    flws!!!!

                    🙂

                    #95738
                    jspaulonci
                    Participante

                      Como disse a você existem várias maneiras
                      bom

                      Para ligar:
                      Vamos supor que você saiba qual é a sessão
                      ALTER system SET timed_statistics = true scope=memory;
                      execute dbms_system.set_sql_trace_in_session(sid, serial, true);
                      para desligar
                      execute dbms_system.set_sql_trace_in_session(sid, serial, false);

                      Depois vá para o seu diretório udump
                      show parameter
                      SQL> show parameter user_dump_des

                      NAME TYPE VALUE


                      user_dump_dest string /u01/app/oracle/base10g/admin/
                      dbhml1/udump

                      Lá será criado um arquivo, teoricamente é o mais atual, ou dá para dar um nome ao arquivo

                      Outra forma é usar o pacote DBMS_SUPPORT em uma trigger,

                      CREATE OR REPLACE TRIGGER SYS.TRACE_SESSION_TRG
                      AFTER LOGON
                      ON DATABASE
                      BEGIN
                      IF sys_context(‘USERENV’,’SESSION_USER’) IN (‘&sess_user_name’) THEN
                      EXECUTE IMMEDIATE
                      ‘BEGIN SYS.DBMS_SUPPORT.START_TRACE( waits=>true, binds=>true ); END;’;
                      END IF;
                      END;
                      /

                      O pacote dbms_support nem sempre está criado.

                      Para criar o pacote DMBS_SUPPORT
                      SQL> connect / AS SYSDBA
                      SQL> @$ORACLE_HOMErdbmsadmindbmssupp.sql
                      SQL> GRANT execute ON dbms_support TO schema_owner;
                      SQL> CREATE PUBLIC SYNONYM dbms_support FOR dbms_support;

                      Lembre-se que você deverá ter espaço suficiente , no diretório udump, senão a casa cae.

                      Outra coisa, tome cuidado com o Trigger, use com cautela.
                      Existem outras maneiras mas essa também serve

                      Mas lembre-se depois você precisar o tkprof em cima do trace que será gerado.

                    Visualizando 9 posts - 1 até 9 (de 9 do total)
                    • Você deve fazer login para responder a este tópico.