Rafael e Chiappa, Permitam-me dar minha opinião.
Uma query rodando em 40 minutos, prá mim é um tempo longo se ela não for um relatório/report. Se está em uma tela de consulta e com o sistema aberto para o usuário da ponta rodá-la, pode olhar que esta rotina é uma séria candidata a um refactoring, nem que seja para uma mudança de estratégia. Outro ponto: levar 8 horas para rodar? só se for um processo batch que atualiza zilhões de linhas. Cuidado com a concorrência, neste caso somente um usuário poderia disparar esta rotina. Se é uma tela de consulta/relatório, a hora de verificar é durante a execução. Pontos a considerar: - tunning da query: vc conhece TUNNING_TASK (dbms_sqltune.create_tuning_task)? Isto pode te ajudar bastante, a analizar sua query, sugerindo indices ou melhor escolha do plano de execução criando um profile otimizado do sql. - Verificar LOCK durante a execução (tem o script UTLLOCKT.sql na área de rdbms/admin). Se está havendo lock entre sessões, uma delas ficará aguardando com a execução parada ... - Verificar V$SESSION_LONGOPS (monitorar query´s demoradas): SELECT TO_CHAR(s.sid) sid, TO_CHAR(s.serial#) serial, s.username, SUBSTR(DECODE(target_desc,NULL,DECODE(target,NULL,opname, concat(opname, concat (' - ',target))), DECODE(target,NULL,concat(opname, concat (' : ',target_desc)), concat(opname, concat (' : ',concat(target_desc, concat (' - ',target)))))),1,25) "Processo" , TO_CHAR(start_time,'dd/mm/yyyy hh24:mi:ss') "Inicio", TO_CHAR(elapsed_seconds,'9999999') "Tempo(s)" , DECODE(sofar, 0, 0, ROUND(elapsed_seconds*(totalwork-sofar)/sofar)) "Blocos Processados" FROM v$session_longops l, v$session s WHERE sofar < totalWork AND s.sid =l.sid; Espero ter ajudado, sei que esta situação é complicadíssima pois já senti na pele. Forte abraço. Ederson Elias DBA Oracle http://br.linkedin.com/pub/ederson-elias/24/8b/8b0 --- Em oracle_br@yahoogrupos.com.br, Rafael Vieira <vieira.rafael44@...> escreveu > > Chiappa, gostaria de mais uma ajuda sua... > Esse batch rodou ontem pela manhã durante 40 minutos, e a tarde rodou em 8 > horas, o pessoal veio argumentar que a aplicação não mudou absolutamente > nada, e que queria uma explicação por conta desse tempo, está todo mundo > colocando a culpa no database, mas eu não mudei absolutamente nada, não foi > feita nenhuma alteração e nenhum ajuste foi feito no database, o argumento do > pessoal é que o o mesmo batch que rodou em 40 minutos e a tarde foi colocado > novamente em execução e acabou em 8 horas. O meu argumento está sendo que o > problema é a query que detectei mal escrita que está dando o problema e que > eh executada dezenas de vezes, mas eles voltam a argumentar o tempo que foi > rodado antes em 40 minutos, teria algo a acrescentar em defesa do database? > Preciso de uma justificativa à dar sobre isso, eu sei que é difícil pra uma > pessoa que está de fora e não tem nem noção da infra-estrutura, nem idéia do > modelo e de como é o processo, > mas se tiver algo a acrescentar, eu agradeceria e MUITO, pois isso vai pra > diretoria e preciso de algo para me justificar. O grande problema é que não > tenho à quem recorrer além do Blog e dos amigos. > > > ________________________________ > De: Rafael Vieira <vieira.rafael44@...> > Para: "oracle_br@yahoogrupos.com.br" <oracle_br@yahoogrupos.com.br> > Enviadas: Quinta-feira, 10 de Maio de 2012 9:35 > Assunto: Re: [oracle_br] Re: Eventos em espera > > > > Chiappa, muito obrigado pela ajuda. > > Realmente, achei muito interessante essa criação da view materializada, > realmente essae query busca milhões de linhas todas as vezes que é > consultada, e como falei anteriormente ela é rodada centenas de vezes( que > segundo o pessoal realmente é necessário). Irei fazer sim esse teste junto > com os desenvolvedores, tomara que dê certo, pelo que li sobre o que vc > escreveu no prórpio grupo sobre MV's é uma excelente alternativa. > > Quanto ao paralelismo em tabelas não existe, existe sim paralelismo em > índices onde a maioria está setada para 8 que é o total de processadores que > nós temos, como esse banco é expecífico para esse BATCH, quando o processo > inicia ninguém mais se conecta no banco por questão de concorrência etc... > > No caso para aumentar a memória para SORT's e HASH's vc se refere a PGA? Eu > sou muito novo na área e estou aprendendo aos poucos, eu me encontro em uma > situação dificil pois não tem outro DBA para me auxiliar. > Então alguns termos as vezes não fica claro para mim. > > As estatísticas, todas estão sim atualizadas. > > ________________________________ > De: J. Laurindo Chiappa <jlchiappa@...> > Para: oracle_br@yahoogrupos.com.br > Enviadas: Quarta-feira, 9 de Maio de 2012 18:10 > Assunto: [oracle_br] Re: Eventos em espera > > > > Colega, lamento ser o desmancha-prazeres, mas é um Fato que : > > - não existe um "parâmetro", um setting que vc aplique e faça qquer tarefa no > banco de dados ficar "rápida" > > - como qquer software, se vc mandar o banco de dados fazer uma asneira > (exemplo, ler a mesma informação vezes e vezes sem conta, repetidas vezes, ou > não usar o melhor construto SQL para uma solicitação, ou acessar um modelo > falho, etc ), ele VAI burramente fazer, não tem por onde > > ==> Então, a partir do momento que vc identificou um processamento que de > cara não parece ser bem-feito E ainda por cima é repetido N vezes, pouco vc > tem fazer no banco de dados em si - com certeza, algum tipo de Tuning no > processo vai ser inescapável.... E que fique Claro, esse Tuning tanto pode > envolver alterações no SQL envolvido (o que é comum), quanto também pode > envolver no modelo (por exemplo, de-normalizando alguns pontos, > criando/removendo índices, utilizando GTT sendo inseridas em APPEND-MODE para > "separar" os dados, etc), quanto pode também envolver uso dos recursos do > banco de dados para diminuir o I/O sendo feito (exemplo, particionamento da > informação, uso de View materializadas que já trazem o resultado desejado > para Evitar ter que ler e ler e ler a informação, etc, etc) .... > > Respondendo porém a sua pergunta sobre os eventos : os eventos com PX como > prefixo são relacionados à SQL executando em parallel mode , e cfrme > http://www.confio.com/blog/oracle-wait-event-explained-direct-path-read-temp > , o evento de direct path read indica que ou o SQL está ordenando dados, ou > está criando um área temporária em disco (para hash, talvez), ou simplesmente > está fazendo paralelismo... TODAS essas operações dificilmente podem ser > feitas em RAM, no caso de Parallel SQL é por definição : o modelo de > paralelismo de SQL no RDBMS Oracle é dividir um segmento por intervalos e ter > N slaves lendo o mesmo segmento, cada um lendo uma porção diferente de > extents e cada slave enviando o que leu para a sessão MASTER, que é aquela de > onde o Parallel SQL se originou, e se lê extents logicamente NÃO pode confiar > no cache, que contém BLOCOS isolados.... > > O que eu diria pra vc fazer de momento então é : > > 1. CONFIRMAR que vc está solicitando um grau de paralelismo razoável nas suas > tabelas e índices, compatível com a quantidade de processadores que vc tem, > com o grau de acesso simultãneo que o seu sub-sistema de I/O permite (é > lógico que se já existem outros jobs consumindo I/O, ou se o seu sub-sistema > de I/O é fraco e não consegue atender grande qtdade de acessos simultâneos, > quanto mais parallel slaves ativos, pior é), e também compatível com os > recursos de hardware (como RAM) ** livres ** : de nada adianta vc ter > trocentos GB de RAM, por exemplo, se desse volume a maior parte já está > alocado, não é porque vc tem dezenas de processadores que vc pode jogar o seu > grau de paralelismo lá em cima se eles estão sendo consumidos.... > > 2. Aumentar substancialmente a memória para SORTs e HASHes, se a qtdade de > direct I/O path diminuir, vc sabe que ao menos parte deles era por SORTs ou > HASHes... > > 3. CONFIRMAR que as estatísticas de Todas as tabelas e Índices envolvidos no > SQL estão coletadas Recentemente, E que são representativas (ie, aonde vc ou > o dono dos dados sabe que há mais valores distintos especificou-se na coleta > HISTOGRAMAS, por exemplo) > > ==> SE mesmo com estas alterações o tempo de duração ficar o mesmo (o que > pelo que vc descreve é bem provável), Não Vejo outro jeito que não se fazer o > Tuning do processo... > > []s > > Chiappa > > --- Em oracle_br@yahoogrupos.com.br, "vieira.rafael44" <vieira.rafael44@> > escreveu > > > > Pessoal, boa tarde. > > > > Estou tendo um problema, existe uma query que é rodada na aplicação > > centenas de vezes é um processo recursivo e conversei com várias pessoas se > > realmente é necessária rodar essa query tantas vezes e todos me disseram > > que era necessário por conta da regra de negócio. > > > > Vi que a query tem sérios problemas de performance, como GROUP BY com 16 > > colunas, ORDER BY com 16 colunas, usa 8 tabelas com apenas 2 filtros, fica > > complicado a minha situação, pois a query não poderá ser mudada agora na > > aplicação e o BATCH precisa terminar e está muito lento por conta desta > > query. > > > > Verifiquei os eventos em espera que está causando no banco e os eventos > > encontrados foram esses: > > > > SELECT s.sid, > > s.serial#, > > s.username, > > sw.event, > > sw.p1text||'='||sw.p1 p1, > > sw.p2text||'='||sw.p2 p2, > > sw.p3text||'='||sw.p3 p3 > > FROM v$session_wait sw, > > v$session s > > WHERE sw.sid in (SELECT sid > > FROM v$session > > WHERE status ='ACTIVE' > > AND USERNAME IS NOT NULL) > > AND sw.sid = s.sid > > ORDER BY sw.event > > > > > > 27 2771 XUXA direct path read file number=16 > > first dba=1677954 block cnt=126 > > > > 6 6009 XUXA direct path write temp file number=201 > > first dba=1343232 block cnt=31 > > > > 1152 2429 XUXA PX Deq Credit: need buffer sleeptime/senderid=268501052 > > passes=27 qref=4801078576 > > > > 1423 69 XUXA PX Deq Credit: send blkd sleeptime/senderid=268501000 > > passes=26 qref=4800963656 > > > > 1449 1515 SYSTEM PX Deq Credit: send blkd sleeptime/senderid=268501032 > > passes=18 qref=4813095152 > > > > > > 1154 5791 XUXA PX Deq: Table Q Normal sleeptime/senderid=200 > > passes=18 =0 > > > > > > Alguns desses eventos aparecem dezenas de vezes, pelo pouco que entendo, > > essa query que é rodada pela aplicação centenas de vezes está buscando os > > dados em disco, se eu estiver correto, o que nao consigo entender que se > > essa query é muito acessada, deveria estar buscando da memória, o banco > > está sendo usado exclusivamente para esse BATCH. > > > > Alguém poderia me orientar o que posso fazer nessa situação? > > > > dados: > > sga_max_target = 4GB > > sga_target = 3GB > > pga_aggregate_target = 2G > > OEL 6 > > Oracle 11gR2 > > > > [As partes desta mensagem que não continham texto foram removidas] > > > > > [As partes desta mensagem que não continham texto foram removidas] >