Fala Gleyson, Sua sugestão bate com uma das que o Chiappa fez, então vou testar e dou um retorno.
Valeu! De: [email protected] [mailto:[email protected]] Em nome de Gleyson Melo Enviada em: segunda-feira, 25 de maio de 2009 20:29 Para: [email protected] Assunto: Re: [oracle_br] Plano diferente quando usa bind Fala Julio, Se você colocar os valores como constantes nas consultas, o Oracle vai fazer o uso de histogramas para verificar a distribuição das colunas e escolher o melhor plano de execução que ele puder com base nisso. Creio que seja esse o problema. Quantas vezes você chama esse SELECT? As vantagens de você usar binds são reaproveitar planos de execução e diminuir a concorrência na Shared Pool. Se você não ficar muito "incomodado" com um uso imperfeito da Shared Pool, você pode substituir colocar esse SELECT dentro de um execute immediate e concatenar os valores que seriam filtrados através de binds. Assim você força o Oracle a escolher um novo plano de execução adequado para esse caso específico. Se você postar a consulta, os planos (com e sem bind), índices e histogramas da tabela, poderemos te ajudar mais. Abraços. 2009/5/25 Julio Bittencourt <[email protected]> > > > Temos um procedimento aqui que está demorando muito para executar. > Após gerar um trace com "set events '10046" e analisá-lo, vi que há três > selects que consomem a maior parte do tempo. > > Peguei cada SELECT e os respectivos valores das variáveis bind e executei > individualmente. > Aí fica muito mais rápido, tipo se no procedimento cada um leva um minuto, > individualmente leva menos de 10, isso quando os blocos ainda não estão no > cache, se rodar de novo leva 1,5 segundos. > > Verifiquei que os planos de execução dos SQLs quando da execução pelo > procedimento são diferentes de quando os executo individualmente com valores > fixos no lugar das variáveis bind. > > Então fiz um teste: Criei um procedimento de teste a partir do original, > substituindo as variáveis pelos valores fixos e, como esperava, o tempo da > execução caiu drasticamente. > Isso indica que o Oracle está usando planos inadequados durante a execução > do procedimento, mas não sei como fazer com que passe a utilizar planos > melhores. > > Vi um artigo do Chiappa que fala sobre Bind Variable Peeking e tentei usar > ALTER SESSION SET "_optim_peek_user_binds"=FALSE; , mas não surtiu efeito. > > Em resumo: Porque o Oracle não usa o mesmo plano de execução quando o > select tem bind e quando tem valores fixos? > O que posso fazer para forçá-lo a usar o mesmo plano? > > Dados do Servidor: > Oracle 9.2.0.7 64 bits + Sun Solaris 9 > Detalhe: COMPATIBLE = 8.1.6 (não me perguntem porque, pois quando eu > cheguei já estava assim e não posso mudar por enquanto) > > Agradeço desde já qualquer ajuda. > Att. > Julio > > Veja quais são os assuntos do momento no Yahoo! +Buscados > http://br.maisbuscados.yahoo.com > > [As partes desta mensagem que não continham texto foram removidas] > > > -- Atenciosamente, Gleyson Melo Oracle Database 10g Administrator Certified Professional [As partes desta mensagem que não continham texto foram removidas] Veja quais são os assuntos do momento no Yahoo! +Buscados http://br.maisbuscados.yahoo.com [As partes desta mensagem que não continham texto foram removidas]
