Não colega, não necessariamente : veja vc, o que estamos discutindo aqui é 
mudança de plano com alteração de colunas passando a acessar tabela onde antes 
não o fazia - vamos pensar juntos , é bastante óbvio que se o seu SELECT só 
pede colunas que estão presentes em índices, Logicamente o RDBMS pode "pular" o 
acesso á tabela, já que os MESMOS EXATOS VALORES que estão presentes no índice 
estão na tabela, óbvio.... 
   Agora, no momento que vc estabelece que Precisa acessar um valor que NÃO 
está no índice, concorda que NÂO TEM COMO o RDBMS recuperar um valor via índice 
apenas que não está presente no índice ???? É algo claro....
   
    Agora, como eu disse : a partir do momento que o RDBMS precisa de um valor 
que não está no índice, ele VAI ter que acessar a tabela, e quem DITA a forma 
como esse acesso vai ser feito é o CBO, usando as estatísticas que tenha : 
assim, SE o CBO entender que ler cada linha do índice para achar a rowid e 
depois para cada linha lida acessar a tabela via ROWID ele fará isso, MAS se 
ele entender (sempre baseado nas ESTATÌSTICAS, contraints, cluster factor dos 
índices, etc)  que é mais rápido/melhor/mais "barato" ler todas as linhas da 
tabela via full index scan, ele fará isso, okdoc ??? 
     Então a sua resposta é NÂO,  NÃO OBRIGATORIAMENTE vc vai ter que "forçar" 
o índice via HINT : em verdade, SE as estatísticas, constraints, cluster 
factors, histogramas, etc, estiverem OK o CBO já vai AUTOMATICAMENTE usar o 
índice se adequado, okdoc ??
      HINTs são tools de "último recurso", a serem usadas APENAS e TÃO SOMENTE 
nos raros, raríssimos casos aonde mesmo com todos os pré-requisitos do CBO 
presentes e em boa forma o CBO não faz a melhor escolha - o caminho 
PREFERENCIAL se vc não está obtendo a melhor resposta possível do CBO é 
checar/verificar os "feeds" do CBO citados...
     
      []s

     Chiappa

--- Em oracle_br@yahoogrupos.com.br, Raphael Franco  escreveu
>
> 
> 
> Então por exemplo:
> 
> Se eu precisar das informações das colunas A,B ou C, usando a condição 
> citada, tenho que forçar o uso do indice (hint) caso eu queira usa-lo ??
> 
> 
> 
> 
> .
> Phael
> 
> 
> 
> 
> ________________________________
>  De: J. Laurindo Chiappa 
> Para: oracle_br@yahoogrupos.com.br 
> Enviadas: Segunda-feira, 28 de Janeiro de 2013 17:24
> Assunto: [oracle_br] Re: Uso de Index
>  
> 
>   
> O conceito é : ** SE ** todas as colunas presentes no SELECT (e no WHERE, 
> dependendo do caso) estão contidas em índice(s), o RDBMS será capaz de obter 
> os valores todos a partir de leituras de índices apenas, sem tocar a tabela, 
> ponto ..... 
> É claro, esse acesso a tabela pode ser via nested loops, hash, full table 
> scan, ou qquer outro meio : quem vai indicar o melhor método de acesso à 
> tabela é o CBO através das Estatísticas, Constraints e demais informações que 
> ele tenha recebido sobre a tabela...
> 
> []s
> 
> Chiappa
> 
> --- Em oracle_br@yahoogrupos.com.br, Raphael Franco  escreveu
> >
> > Verificando melhor...
> > 
> > Somente usa indice se colocar o(s) campo(s) da condição no select e nada 
> > mais:
> > Exemplos:
> > select TIPO, DATA from XXX where TIPO in ('1a','1d') and DATA between 
> > '01/01/2012' and '31/01/2012';
> > select TIPO from XXX where TIPO in ('1a','1d') and DATA between 
> > '01/01/2012' and '31/01/2012';
> > select DATA from XXX where TIPO in ('1a','1d') and DATA between 
> > '01/01/2012' and '31/01/2012';
> > 
> > Se eu colocar qualquer outra coluna, = TABLE ACCESS FULL:
> > 
> > select A,TIPO, DATA from XXX where TIPO in ('1a','1d') and DATA between 
> > '01/01/2012' and '31/01/2012';
> > select TIPO,B from XXX where TIPO in ('1a','1d') and DATA between 
> > '01/01/2012' and '31/01/2012';
> > select B from XXX where TIPO in ('1a','1d') and DATA between '01/01/2012' 
> > and '31/01/2012';
> > select A,B from XXX where TIPO in ('1a','1d') and DATA between '01/01/2012' 
> > and '31/01/2012';
> > 
> > 
> > O conceito é esse mesmo ??
> > 
> > 
> > Phael
> > 
> > 
> > 
> > ________________________________
> >  De: J. Laurindo Chiappa 
> > Para: oracle_br@yahoogrupos.com.br 
> > Enviadas: Segunda-feira, 28 de Janeiro de 2013 16:26
> > Assunto: [oracle_br] Re: Uso de Index
> > 
> > 
> >   
> > Colega, a principal situação aonde o RDBMS Oracle pode mudar o plano de 
> > acesso adicionando ou removendo uma coluna B qquer é : há um (ou mais) 
> > índice(s) na(s) única(s) coluna(s) citada(s) no SELECT, assim sendo o RDBMS 
> > podia recuperar os dados apenas pelo índice , E o(s) índice(s) não contém a 
> > coluna B - aí Não Tem Como a informação que não está indexada ser 
> > recuperada só com leitura de índice, sendo FORÇOSO acesso á tabela que 
> > contém a coluna B....   Outra possibilidade ** muito ** comum é que o XXX 
> > que vc cita sendo usado no FROm seja uma view , talvez relativamente 
> > complexa, e a coluna B em questão venda de um tabela sendo joineada com 
> > outras - sem B ser especificada todo o join é "pulado", quando vc 
> > especifica B aí não tem jeito, o join que traz a coluna B ** tem ** que ser 
> > executado, aí aparece no plano...
> > Para verificar se é alguma das possibilidades acima, nos mande :
> > 
> > - o Plano de Execução *** real *** (absolutamente NÃO É um EXPLAIN PLAN, 
> > queremos o plano Real extraído via DBMS_XPLAN ou trace 10046) dos SQLs com 
> > e sem a adição da coluna
> > - os CREATEs e INSERTs necessários para podermos tentar reproduzir
> > - a versão Exata de tudo
> > 
> > []s
> > 
> > Chiappa
> > 
> > OBS : é claro, se a coluna é DATE sempre é uma coisa ILÓGICA e PERIGOSA 
> > confiar em conversão explícita, fazendo o ** muito errado ** ... and DATA 
> > between '01/01/2012' and '31/01/2012'...  ao invés do Correto ... and DATA 
> > between TO_DATE('01/01/2012', 'DD/MM/YYYY') and TO_DATE('31/01/2012', 
> > 'DD/MM/YYYY') ... , mas IMAGINO que isso não tem a ver com a sua pergunta : 
> > anyway, PLZ cesse a aborte essa prática...
> > 
> > --- Em oracle_br@yahoogrupos.com.br, Raphael Franco  escreveu
> > >
> > > Pessoal,
> > > 
> > > Alguem me tira essa duvida:
> > > 
> > > Oracle 10g/Linux.
> > > 
> > > Sem aprofundar muito, tenho uma tabela XXX com varias colunas/Index.
> > > 
> > > Estou fazendo uma query:
> > > 
> > > 
> > >  select A from XXX where TIPO in ('1a','1d') and DATA between 
> > > '01/01/2012' and '31/01/2012';
> > > 
> > > O plano de execução mostra a utilização dos 2 indices da coluna TIPO e 
> > > DATA.
> > > INDEX RANGE SCAN
> > > 
> > > 
> > > Se eu fizer essa alteração:
> > > 
> > > select A,B from XXX where TIPO in ('1a','1d') and DATA between 
> > > '01/01/2012' and '31/01/2012';
> > > 
> > > Não usa os indices.
> > > TABLE ACCESS FULL
> > > 
> > > 
> > > 
> > > 
> > > Em qual situação o Oracle poderia mudar o plano de execução somente 
> > > colocando mais uma coluna no select, sendo a condição igual para ambos ???
> > > 
> > > 
> > > 
> > > 
> > > att.
> > > Phael
> > > 
> > > 
> > > [As partes desta mensagem que não continham texto foram removidas]
> > >
> > 
> > 
> > 
> > 
> > [As partes desta mensagem que não continham texto foram removidas]
> >
> 
> 
>  
> 
> [As partes desta mensagem que não continham texto foram removidas]
>


Responder a