O que acontece é que: quando os dados são conhecidos pelo Oracle, através
das estatísticas, o otimizador, por meio de cálculos aritméticos (isso pode
ser visto com o dump 10053) decide qual a melhor forma de trazer os dados,
que é a parte mais difícil, digamos, da execução da query. Obviamente, o
otimizador conhece a ordem se seus dados através do CLUSTERING_FACTOR na
DBA_INDEXES, quanto mais próximo essa valor estiver do número de blocos,
mais "organizado" estão seus dados em relação a seu índice e, portanto,
menos trabalho com o ORDER BY ele vai ter.

Também comecei minha "jornada" na decada de 80, mas com o COBOL. A diferença
entre o Oracle e os demais bancos é a forma otimizada de realizar os
trabalhos de busca de dados. Já trabalhei com Sybase e vi bem pouco de SQL
Server, e não sei se hoje em dia eles trabalham com algo semelhante a
recuperação de dados baseado em estatística. No Sybase, havia um tal índice
clusterizado, que era mais ou menos a IOT no Oracle, que trazia os dados de
forma ordenada ao índice, entretanto, mesmo tabelas do tipo IOT do Oracle,
não garantem que a ordem seja a da primary key, depende do plano que
otimizador escolhe - é lógico que se o ORDER BY for da primary key da IOT e
somente ela estiver envolvida no SELECT, o otimizador evita o SORT ORDER BY,
porém, uma vez envolvida em uma query com outras tabelas, o otimizador volta
a fazer o SORT ORDER BY por último.

Quanto ao hint, tente descobrir, através dos planos de execução, porque voce
TEVE que "hintar" a query. Pode ser problema de estatística antiga, má
configuração de alguns parâmetros do CBO, como por ex.,
OPTIMIZER_INDEX_CACHING, OPTIMIZER_INDEX_COST_ADJ,
DB_FILE_MULTIBLOCK_READ_COUNT, também, se alguma tabela envolvida na sua
query não tenha estatística, o oracle usa estatística "inventada" e isso não
leva o otimizador a tomar a decisão correta (no default statitics, por ex.,
numero de bloco é 1, média do tamanho da linha é 100 bytes, etc), enfim,
voce precisa investigar porque teve que usar hint. E provavelmente, em uma
migração ou upgrade futuro, terá impacto com esse hint.


On 4/5/07, Arnaldo Vicente Scarin <[EMAIL PROTECTED]> wrote:
>
>   Obrigado Marcio, mas gostaria de falar mais a respeito.
>
> Quando eu começei a trabalhar com Informática, na década de 80, utilizei
> conceitos como Banco de Dados xBase.
> Um indice servia para acelerar um pesquisa além de organizar os dados de
> acordo com a chave indicada para aquele indice. Dessa forma, quando se fazia
> uma consulta atraves de um Seek e armazenava-se o resultado, esse resultado
> estava indexado da forma com que seria necessário.
>
> A minha duvida paira exatamente nisso. Um banco de dados tão poderoso como
> o Oracle, utilizar um indice somente para acelerar uma consulta me parece
> uma coisa "descabida", uma vez que ele guarda o timestamp da linha para
> formar a ordenação no indice, uma visualização desse table na ordem da chave
> do indice não seria nada dificil de ser feita. Nessa minha forma de análise,
> o Otimizador (desculpe a confusão com o parser) não precisaria ter o segundo
> trabalho de re-ordernar os dados, uma vez que eles já estariam na ordem
> correta.
>
> Não sei se outros bancos de dados trabalham da mesma forma que o Oracle,
> mas eu trabalhei com SQL-Server e se eu não me engano, ele retorna os dados
> de acordo com o Index utilizado.
>
> Quanto a utilização de Hint, eu fiz uma analisa atraves do Pl/Sql
> Developer, e para o mesmo select o tempo de resposta utilizando o Hint está
> cerca de 60% mais rápido do que a utilização sem ele.
>
> Mais uma vez obrigado,
>
> ----- Mensagem original ----
> De: Marcio Portes <[EMAIL PROTECTED] <portes.marcio%40gmail.com>>
> Para: oracle_br@yahoogrupos.com.br <oracle_br%40yahoogrupos.com.br>
> Enviadas: Quinta-feira, 5 de Abril de 2007 19:24:20
> Assunto: Re: [oracle_br] Duvida em Select com Index
>
> Arnaldo,
>
> Se voce quer que seu result set venha em alguma ordem, voce NECESSITA usar
> o
> ORDER BY. É obrigatório e amplamente discutido na internet, inclusive o
> Jonathan Lewis escreveu uma artigo excelente sobre esse tema.
>
> http://jonathanlewi s.wordpress. com/2007/ 03/05/ordering/
>
> Outra coisa, hint de indice não é uma boa idéia, fiz um pequeno artigo
> sobre
> índices um tempinho atrás.
> http://mportes. blogspot. com/2005/ 05/ndices- falando-livremen te.html
>
> No seu caso, (se estiver na versão 10g) um hint interessante para ser
> usado
> com ORDER BY seria o /*+ FIRST_ROWS(n) */ onde n é o número de linhas
> esperado para a consulta.
>
> Não há movimentação de parse quando o order by é usado, acho que voce quis
> dizer otimizador. O order by acontece na sua porção de memória (PGA) e,
> portanto, longe do parse. A última operação, na execução da query, é a
> ordenação.
>
> On 4/4/07, Arnaldo V. Scarin <[EMAIL PROTECTED] com.br> wrote:
> >
> > Boa tarde a Todos,
> >
> > Sou novo no grupo e não sou DBA, sou Analista de Sistemas.
> >
> > Hoje eu estava debatendo com outras pessoas e me disseram que um
> "Select"
> > feito com hint (forçando o Indice) pode não retornar o ResultSet em
> ordem
> > se
> > eu não usar um "Order by", ou seja, se eu fizer o seguinte select:
> >
> > Select /*+ INDEX ( ENTIDADE PK_ENTIDADE4 ) */ cpfcgc, nome, apelido,
> > datacadastro
> > from entidade
> > where cpfcgc between '2' and '2z'
> >
> > onde PK_Entidade4 é um indice somente do campo CPFCGC, poderá sair fora
> da
> > ordem?
> >
> > A priori acho isso estranho, pois o indice (se eu não me engano o Oracle
> > usa
> > o formato b-tree), "organiza" as linhas de acordo com o campo indicado
> > como
> > chave do indice, e consequentemente o resultset sairia em ordem, mas em
> > contra partida, se eu tenho que usar um "order by" eu estou forçando o
> > parser do banco criar uma tabela temporaria para descarregar todos os
> > resultados e depois executar um sort nesse resultset.
> >
> > Não seria um contrasenso isso?
> >
> >
> > Obrigado,
> >
> > Arnaldo
> >
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
> >
> >
>
> --
> Marcio Portes
> Material Tecnico em Portugues - http://mportes. blogspot. com
> Practical Learning Oracle -
> http://mportes. blogspot. com/2006/ 02/practical- learning- oracle.html
>
> [As partes desta mensagem que não continham texto foram removidas]
>
> __________________________________________________
> Fale com seus amigos de graça com o novo Yahoo! Messenger
> http://br.messenger.yahoo.com/
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>  
>



-- 
Marcio Portes
Material Tecnico em Portugues - http://mportes.blogspot.com
Practical Learning Oracle     -
http://mportes.blogspot.com/2006/02/practical-learning-oracle.html


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

Responder a