- Este tópico contém 4 respostas, 3 vozes e foi atualizado pela última vez 17 anos, 9 meses atrás por
goncalves_e.
-
AutorPosts
-
29 de maio de 2008 às 3:16 am #81901
farzac
ParticipanteOla galera
No trabalho, estou precisando melhorar a performance de um processo de gerar notas fiscais, porem este processo chama varios pacotes e o mais incrivel é que a performance é ruim apenas na primeira vez do dia para determinado cliente. Na minha opiniao acredito que seja por causa que depois que o processo foi gerado, os dados fica armazenado na memoria.
Mas mesmo que seja uma vez no dia, este processo demora muito.
Alguem sabe alguma tecnica que eu deva fazer para encontrar em que ponto que esta deixando meu processo lento.
Preciso encontrar qual query ou pacote que esta ocasionando a lentidao, ja tentei medir a performance de cada query, mas como são muitas, nao tem como.
Espero que alguem de uma solução.
29 de maio de 2008 às 8:04 pm #81904Marcio68Almeida
ParticipanteBom…
Quando há perda de performance apenas na primeira vez, pode ser por que o PARSE ainda não foi resolvido, se há tantos processos como diz, isso realmetne pode demorar um certo tempo para ser resolvido, se bem que não sei quanto é MUITO para você…
Outra coisa pode ser o armazenamento dos dados em memória, que realmente pode reduzir grandemente o tempo.
Só não entendi por que UM CLIENTE ESPECÍFICO, nos demais clientes esse problema não ocorre ???
Você pode usar estar ferramentas para ajuda-lo a procurar eventuais consultas FULL :
Select s.address, s.last_load_time, s.first_load_time, s.cpu_time, s.elapsed_time, p.object_owner, p.object_name, p.cost, p.cardinality, p.bytes, p.io_cost, p.filter_predicates, w.active_time, w.estimated_optimal_size, w.last_memory_used, w.total_executions, w.active_time
From v$sql_plan p,
v$sql s,
v$sql_workarea w
Where p.address = s.address
And p.address = w.address (+)
And p.hash_value = w.hash_value (+)
And p.id = w.operation_id (+)
And p.options = 'FULL'
And p.object_owner not like '%SYS%'
And SUBSTR (last_load_time, 1, 10) = TO_CHAR (sysdate, 'yyyy-mm-dd')
And p.filter_predicates is not null
Order by cpu_time desc
Com a consulta acima você encontrará onde há sérios problemas…
select p.hash_value, operation, options, object_name name, trunc (bytes / 1048576) "input(MB)", trunc(last_memory_used / 1024) last_mem, trunc (estimated_optimal_size/1024) opt_mem, trunc (estimated_onepass_size/1024) onepass_mem, decode (optimal_executions, null, '-', optimal_executions || '/' || onepass_executions || '/' || multipasses_executions) "O/1/M"
from v$sql_plan p,
v$sql_workarea w
where p.address = w.address (+)
And p.hash_value = w.hash_value (+)
And p.id = w.operation_id (+)
And p.address = ''
Na consulta acima você vai ver mais alguns detalhes sobre a referida consulta…
Select sql_text from v$sqltext where address = '' order by piece;2 de junho de 2008 às 8:29 pm #81908goncalves_e
ParticipanteBoa tarde,
O que você pode fazer, também, é tirar um trace desta aplicação. Nele vão constar algumas informações de como o otimizador está executando este processo.
Depois de rodar a aplicação com o trace ativado use o tkprof para formatar, e não esqueça de colocar a seguinte expressão no comando tkprof: sort=fchela. Isto fará com que o arquivo do tkprof seja ordenado pela consulta SQL que mais está “custando” ao banco. Desta forma, você poderá ter um ponto inicial para atacar o problema.
Qualquer dúvida contate-me.
Abraço
Eduardo.3 de junho de 2008 às 2:56 am #81909farzac
ParticipanteOla Eduardo.
Como eu utilizo o tkprof, ja ouvi falar sobre, mas nao sei como utilizar.
Desde ja, muito obrigado.
3 de junho de 2008 às 3:41 am #81912goncalves_e
ParticipanteOpa!
Assim, antes da gente entrar no mérito do tkprof, preciso saber se vc tem conhecimento sobre o trace? Pois, primeiro, vamos ter que rodar um trace da aplicação pra depois usar o tkprof para formatar o resultado do trace.
Se por acaso vc tiver contato com o DBA, ele pode fazer isso pra vc, pois ele tem o conhecimento para isso. Caso não tenha este contato, posso tentar te ajudar.
Vamos supor que não tenhamos a ajuda de um DBA e mesmo assim, queremos executar o trace. Pois bem, me diz uma coisa, este procedimento de geração de nffs é uma procedure, função ou algo no gênero? Ou se trata de um programa escrito em tela?
Na verdade, o que quero saber com isto, é se podemos rodar este processo via SQL*Plus, por exemplo. Se você consegue, já fica mais fácil.
Esta aplicação é uma aplicação específica ou é Oracle Application (EBS)?
Me passa estes dados e aí vou tentar te ajudar. Ok?
Abraço.
Eduardo. -
AutorPosts
- Você deve fazer login para responder a este tópico.