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]

Responder a