- Este tópico contém 8 respostas, 3 vozes e foi atualizado pela última vez 15 anos, 6 meses atrás por
jspaulonci.
-
AutorPosts
-
26 de agosto de 2010 às 11:52 pm #95699
mpvargas
ParticipanteCaros 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.26 de agosto de 2010 às 11:59 pm #95700mpvargas
ParticipanteComplementando…
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?
Obrigado27 de agosto de 2010 às 12:52 am #95702mpvargas
ParticipanteAlgumas 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])27 de agosto de 2010 às 4:09 pm #95710jspaulonci
ParticipanteBom 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,2Quanto 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
27 de agosto de 2010 às 5:15 pm #95713Sousa04
ParticipanteUtilizo esse script para ver o status atual da Query. Muito bom!!
SET PAGESIZE 100 WRAP ON
SPOOL sessinfo.txtPROMPT ======================================================================
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 COLPROMPT ======================================================================
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 1Agora 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
27 de agosto de 2010 às 5:16 pm #95714Sousa04
ParticipantePara executar o script
@/diretório/nomedoscript SID
vlw
27 de agosto de 2010 às 10:27 pm #95723mpvargas
ParticipanteCompanheiros, 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
28 de agosto de 2010 às 1:02 am #95735Sousa04
ParticipanteColoca 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!!!!
🙂
28 de agosto de 2010 às 4:01 pm #95738jspaulonci
ParticipanteComo disse a você existem várias maneiras
bomPara 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_desNAME TYPE VALUE
user_dump_dest string /u01/app/oracle/base10g/admin/
dbhml1/udumpLá 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 serveMas lembre-se depois você precisar o tkprof em cima do trace que será gerado.
-
AutorPosts
- Você deve fazer login para responder a este tópico.