Chiappa, obrigado pelo retorno e pelas dicas.

O sistema que roda a procedure é de terceiros, entramos em contato com o 
fabricante e o mesmo argumentava que o problema estava no banco, que não tinha 
memória para processar. Hoje a base temos 160GB de informação, é uma empresa de 
pão, então temos um processamento em tabelas com milhões de linhas, e o 
relatório do fornecedor com uma tabela de 8 mil linhas demora mais de 4 horas. 

Alterei a procedure e consegui um tempo bom, o usuário fará o teste para ver se 
os valores estão corretos. O problema que eu via no select da procedure, era um 
LEFT OUTER JOIN, eu tirava essa linha e o resultado trazia, além dessa mudança 
eu filtrei os dados para o processamento.

A Tablespace Temporária ela é realmente de 4GB, peguei o ambiente pronto, e 
hoje se eu fosse precisar montar um ambiente novo não saberia o quanto colocar 
na Temporária, estarei consultando os manuais para um detalhamento. Sobre o 
espaço, tinha visto no OEM, ele exibi em uma das telas essa porcentagem 
utilizada, mas olhando bem tenho apenas 70MB utlizado.

[]'s.
Márcio

 ----- Original Message ----- 

  From: jlchiappa 
  To: oracle_br@yahoogrupos.com.br 
  Sent: Monday, October 26, 2009 12:19 PM
  Subject: [oracle_br] Re: direct path read/write temp


    Colega, umas dicas de tunning de SQL :

  1. o CUSTO nada mais é do que uma estimativa de tempo, em cima de quanto 
tempo o otimizador acha que vai levar pra recuperar os blocos todos necessários 
- ORA, eu disse estimativa porque NA PRÁTICA NÃO TEM COMO o Otimizador saber o 
throughput ** REAL ** do seu sub-sistema de I/O, se vai ou não ter ** várias ** 
sessões concorrendo pelos mesmos blocos , essas coisas podem MUITO FACILMENTE 
deixar um plano com um custo baixo demorado ao extremo, ok ?????? Sendo assim, 
se o Custo pode ser 'tapeado' por concorrência e situações do tipo, não é legal 
confiar só nele pro tuning, então como é que vc identifica ineficiências no 
seus SQLs mais seguramente ? Fácil, ** esqueça ** o CUSTO num primeiro momento 
e vá olhar o traço que está SEMPRE presente num SQL ruim, que I/O excessivo.... 
Aqui cabe uma observação CRÍTICA, que é : no bd Oracle, I/O é definido como a 
leitura de um bloco, e **** QUALQUER TIPO DE I/O **** é ruim - mesmo quando a 
informação vêm dum cache, a leitura foi feita em RAM mas isso é SIM um I/O (um 
LIO, Logical I/O, um I/O lógico, mas é I/O), e como todo I/O ele CONSOME CPU, 
faz o banco trabalhar mais, NÂO É instantâneo... Tem gente que acha que um I/O 
em RAM é desprezível mas NÂO É VERDADE, cada LIO consome CPU, há waits sim por 
eles, o bloco lido TEM que ser colocado no cache, a fila de blocos menos e mais 
usados tem que ser gerida.... Complemento essa informação com o fato que :

  a. é IMPOSSÌVEL vc ter toda a informação em cache

  b. mesmo quando a informação não está no cache e uma leitura física (PIO, 
Physical I/O) é requerida, o bloco (de dados) lido do disco *** necessariamente 
*** tem que ir pro cache, ou seja, há um LIO após o PIO

  Então, o teu objetivo passa a ser BAIXAR OS LIOs !!! Assim, ** despreze ** 
indicadores tipo cache hit ratio (que medem quanto de PIO está havendo), pois 
como eu disse acima AINDA que a esmagadora maioria dos I/Os sejam LIOs, se eles 
estiverem acontecendo em excesso waits vão ser inevitáveis, eles TEM SIM custo 
em termos de performance... 

  Como vc analisa os LIOs de um SQL ? De várias maneiras, mas as melhores são 
as tools nativas do Oracle, como E como vc baixa os LIOs ??? De várias maneiras 
:

  a) RE-ESCREVENDO o SQL de uma maneira que leia menos informação (por exemplo, 
não pedidno pra varrer a mesma tabela várias vezes), usando os RECURSOS do 
banco de dados Oracle que permitem economia de leituras (como funções 
analíticas, WITH clause, etc)

  e/ou 

  b) RECRIANDO/adicionando novos elementos na estrutura física (ou mesmo no 
modelo) do seu banco que permitam obter os dados sem ter que varrer tabelas - 
por exemplo, novos índices (talvez até mesmo índices parciais, criados via 
FUNCTION, que só indexem a parte que vc quer da informação), views 
materializadas, desnormalizar parte do modelo, uma tabela global temporary 
table com apenas a parte da informação que interessa pro JOIN, coisas do tipo 
....

  
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:6749454952894
 fala bastante sobre o assunto, ok ???


  2. evidentemente, antes de sair otimizando o SQL vc tem que garantir que o 
CBO está gerando o MELHOR PLANO POSSÌVEL, então tenha absoluta certeza que as 
estatísticas estão frescas e completas (tanto pra tabelas quanto pra índices), 
veja que os parâmetros de controle do CBO estão adequados pro seu caso (nãosó 
os optimizer, mas os NN_size se vc os usa), veja que as constraints 
(principalmente as de PK/UK) estão sim no lugar (elas dão insights preciosos 
pro CBO muitas vezes).... 

  3. CARDINALIDADE, essa é uma questão-CHAVE quando se discute tuning em CBO : 
a função do CBO é estimar quantas linhas um SQL retorna, que aí sabendo o total 
de linhas (coluna NUM_ROWS, as estats coletam isso) ele pode fazer uma regrinha 
de três , tipo assim, e chegar na resposta : PORÉM, podem haver casos de 
distribuição IRREGULAR, aonde pra um valor X em especial retorna muito mais ou 
muito menos linhas do que a estimativa aritmética, aí isso tem que ser ajustado 
: http://www.centrexcc.com/Tuning%20by%20Cardinality%20Feedback.ppt.pdf fala um 
pouqinho sobre isso


  4. o ponto final é o MAIS importante, o Conhecimento do seu ambiente : se vc 
postar a sua SQL aqui, com certeza pode ser que nós NÂO CONSIGAMOS dizer nada, 
pois NÂO SABEMOS quais índices existem pras tabelas, QUAIS das tabelas no JOIN 
(que deve ser JOIN essa query...) são obrigatórias de estarem lá pelo negócio, 
NÃO SABEMOS se (digamos) é aceitável/possível informar valores menores nos 
eventuais intervalos de pesquisa, entre outros.... Assim, se mesmo vc não tem 
esse Conhecimento, adquira-o consultando o dicionário de dados, conversando com 
os Analistas, usuários, programadores, fornecedor do programa, aonde puder, 
pois ele VAI SER SIM necessário...

  []s

  Chiappa


  OBS : 

  - o latch que vc cita ocorre quando várias sessões estão fazendo LIOs nos 
mesmos e mesmos blocos, isso PODE SER uma indicação de custo sendo 'tapeado' 
por concorrência, E direct path read implica que alguma operação temporária em 
disco (criação de hash table, ordenação, seja o que for) está rolando : creio 
que vc TEM QUE identificar se o plano está bom, se o CBO está OK, se a 
cardinalidade tá dentro, tentar re-escrever , se nada resultar vc pode tentar 
otimizar a operação temporária alocando mais área de sort, de hash ou o que for 
q ela usa

  e

  - quanto à pergunta de temp, veja lá : vc *** ESTÀ ** medindo o consumo da 
temp de forma correta ????????? Pois no bd Oracle quando alguém deixa de usar a 
área temporária em disco, pra melhor performance o banco ***** NÂO ****** 
diminui a área, simplesmente libera-a, e a próxima sessão grav POR CIMA do que 
a outra fez, ok ? Assim, se vc tiver na DBA_FREE_SPACE, ou em disco consultando 
pelo SO, 3.9 Gb isso NÂO QUER DIZER que todo esse valor está em uso efetivo, 
PODE SER QUE as sessões anteriores fizeram a área crscer até 3.9 mas nesse 
momento não é esse o consumo real, vc TEM QUE consultar as views de V$SORT_nnn 
pra ver desse total quanto que REALMENTE está sendo usado e quanto que está em 
disco mas tá liberado, é reusável... SE EFETIVAMENTE o consumo REAL estiver 
perto do limite aí SIM, não tem o que pensar, aumentar essa temp em muito : 
aliás, 4 Gb é ** minúsculo **, isso é menos que o PEN DRIVE que tá espetado no 
meu micro, Realmente vc tá usando mesmo só isso ??? 

  --- Em oracle_br@yahoogrupos.com.br, Márcio Ricardo Alves da Silva 
<marcio_...@...> escreveu
  >
  > GeleiraBoas.
  > 
  > Estou com uma procedure num sistema para geração de relatório, que está 
demorando cerca de 5 horas, o custo inicial dela era:
  > 
  > Cost=25 Cardinality=1 Bytes=235 CPU cost=34540690 
  > e deixei até agora com
  > Cost=25 Cardinality=1 Bytes=235 CPU cost=34540690 
  > 
  > quando roda o select da procedure ele chega em uma tabela e fica com DIRECT 
PATH READ TEMP, e LATCH BUFFER CHAINS.
  > 
  > Minha Tablespace Temporária é de 4GB e está sendo usado 3,9GB, é 
aconselhável eu criar outra tablespace para?
  > 
  > Release 10.2.0.1.0
  > 
  > Grato,
  > Márcio.
  > 
  > [As partes desta mensagem que não continham texto foram removidas]
  >



  

[As partes desta mensagem que não continham texto foram removidas]

Responder a