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]