[oracle_br] Índices no Oracle

2014-02-03 Por tôpico Yuri Menon
Boa tarde pessoal!

Podem me auxiliar por favor?

A seguinte consulta:

SELECT *
FROM TMOV
WHERE CODCXA = '12345'

Retorna 3500 registros e está muito lenta.
Em conta disso, criei um índice que aponta para TMOV.CODCXA
No entanto, esse índice só é utilizado quando dou APENAS um:
SELECT CODCXA FROM TMOV WHERE CODCXA = '12345'
não é utilizado para:
SELECT * FROM TMOV WHERE CODCXA = '12345'

A minha dúvida:
É normal isso no Oracle?
Se eu quiser fazer SELECT * terei de criar um índice que enxergue todos
os campos?

Obs: tentei passar com HINT pra tentar forçar, mas não foi.

Desde já agradeço!


Re: [oracle_br] Índices no Oracle

2014-02-03 Por tôpico Fabio Prado
Yuri, se o índice foi utilizado na 1a. situação ele tbém deve estar sendo
utilizado na 2a. situação, mas na primeira ele acessa somente o índice, na
2a. o otimizador acesso o índice, recupera o rowid da linha e vai para a
tabela recuperar os dados das demais colunas. Para verificarmos isso com
certeza, passe para nós o plano de execução.

[]s

Fábio Prado
www.fabioprado.net


Em 3 de fevereiro de 2014 13:22, Yuri Menon yuri.me...@gmail.com escreveu:



 Boa tarde pessoal!

 Podem me auxiliar por favor?

 A seguinte consulta:

 SELECT *
 FROM TMOV
 WHERE CODCXA = '12345'

 Retorna 3500 registros e está muito lenta.
 Em conta disso, criei um índice que aponta para TMOV.CODCXA
 No entanto, esse índice só é utilizado quando dou APENAS um:
 SELECT CODCXA FROM TMOV WHERE CODCXA = '12345'
 não é utilizado para:
 SELECT * FROM TMOV WHERE CODCXA = '12345'

 A minha dúvida:
 É normal isso no Oracle?
 Se eu quiser fazer SELECT * terei de criar um índice que enxergue todos
 os campos?

 Obs: tentei passar com HINT pra tentar forçar, mas não foi.

 Desde já agradeço!

  




-- 
Fábio Prado
www.fabioprado.net
Compartilhando conhecimentos e treinando profissionais em Bancos de Dados
Oracle


Re: [oracle_br] Índices no Oracle

2014-02-03 Por tôpico Ivan Ricardo Schuster
Yuri,

Por acaso CODCXA não é do tipo number?
Se for, retire as aspas simples ao realizar a consulta:

SELECT * FROM TMOV WHERE CODCXA = 12345

Caso não resolva, mande pra gente o ddl de criação da tabela e do índice
para facilitar a análise.

Abraço


2014-02-03 Fabio Prado fbifa...@gmail.com:



 Yuri, se o índice foi utilizado na 1a. situação ele tbém deve estar sendo
 utilizado na 2a. situação, mas na primeira ele acessa somente o índice, na
 2a. o otimizador acesso o índice, recupera o rowid da linha e vai para a
 tabela recuperar os dados das demais colunas. Para verificarmos isso com
 certeza, passe para nós o plano de execução.

 []s

 Fábio Prado
 www.fabioprado.net


 Em 3 de fevereiro de 2014 13:22, Yuri Menon yuri.me...@gmail.comescreveu:



 Boa tarde pessoal!

 Podem me auxiliar por favor?

 A seguinte consulta:

 SELECT *
 FROM TMOV
 WHERE CODCXA = '12345'

 Retorna 3500 registros e está muito lenta.
 Em conta disso, criei um índice que aponta para TMOV.CODCXA
 No entanto, esse índice só é utilizado quando dou APENAS um:
 SELECT CODCXA FROM TMOV WHERE CODCXA = '12345'
 não é utilizado para:
 SELECT * FROM TMOV WHERE CODCXA = '12345'

 A minha dúvida:
 É normal isso no Oracle?
 Se eu quiser fazer SELECT * terei de criar um índice que enxergue todos
 os campos?

 Obs: tentei passar com HINT pra tentar forçar, mas não foi.

 Desde já agradeço!




 --
 Fábio Prado
 www.fabioprado.net
 Compartilhando conhecimentos e treinando profissionais em Bancos de Dados
 Oracle



 



Re: [oracle_br] Índices no Oracle

2014-02-03 Por tôpico Milton Bastos Henriquis Jr.
Qual o TOTAL de registros dessa tabela?




Em 3 de fevereiro de 2014 13:43, Ivan Ricardo Schuster
ivanr...@gmail.comescreveu:



 Yuri,

 Por acaso CODCXA não é do tipo number?
 Se for, retire as aspas simples ao realizar a consulta:


 SELECT * FROM TMOV WHERE CODCXA = 12345

 Caso não resolva, mande pra gente o ddl de criação da tabela e do índice
 para facilitar a análise.

 Abraço


 2014-02-03 Fabio Prado fbifa...@gmail.com:



 Yuri, se o índice foi utilizado na 1a. situação ele tbém deve estar sendo
 utilizado na 2a. situação, mas na primeira ele acessa somente o índice, na
 2a. o otimizador acesso o índice, recupera o rowid da linha e vai para a
 tabela recuperar os dados das demais colunas. Para verificarmos isso com
 certeza, passe para nós o plano de execução.

 []s

 Fábio Prado
 www.fabioprado.net


 Em 3 de fevereiro de 2014 13:22, Yuri Menon yuri.me...@gmail.comescreveu:



 Boa tarde pessoal!

 Podem me auxiliar por favor?

 A seguinte consulta:

 SELECT *
 FROM TMOV
 WHERE CODCXA = '12345'

 Retorna 3500 registros e está muito lenta.
 Em conta disso, criei um índice que aponta para TMOV.CODCXA
 No entanto, esse índice só é utilizado quando dou APENAS um:
 SELECT CODCXA FROM TMOV WHERE CODCXA = '12345'
 não é utilizado para:
 SELECT * FROM TMOV WHERE CODCXA = '12345'

 A minha dúvida:
 É normal isso no Oracle?
 Se eu quiser fazer SELECT * terei de criar um índice que enxergue
 todos os campos?

 Obs: tentei passar com HINT pra tentar forçar, mas não foi.

 Desde já agradeço!




 --
 Fábio Prado
 www.fabioprado.net
 Compartilhando conhecimentos e treinando profissionais em Bancos de
 Dados Oracle




  



[oracle_br] RMAN-06024: no backup or copy of the control file found to restore

2014-02-03 Por tôpico Rafael Mendonca
Boa tarde a todos.
 
Ao realizar o restore do controlfile me deparo com o seguinte erro:
 
RMAN run {
ALLOCATE CHANNEL C1 TYPE 'SBT_TAPE' PARMS 
'ENV=(TDPO_OPTFILE=/opt/tivoli/tsm/client/oracle/bin64/tdpo.opt)';
RESTORE CONTROLFILE;
}
 
released channel: C1
RMAN-00571: ===
RMAN-00569: === ERROR MESSAGE STACK FOLLOWS ===
RMAN-00571: ===
RMAN-03002: failure of restore command at 02/03/2014 13:20:13
RMAN-06026: some targets not found - aborting restore
RMAN-06024: no backup or copy of the control file found to restore
 
 
 
Antes de restaurar o controlfile, restaurei o SPFILE da mesma forma e foi 
restaurado com sucesso.
 
run {
ALLOCATE CHANNEL C1 TYPE 'SBT_TAPE' PARMS 
'ENV=(TDPO_OPTFILE=/opt/tivoli/tsm/client/oracle/bin64/tdpo.opt)';
RESTORE SPFILE TO 
'/u01/app/oracle/product/11.2.0.3/dbhome_1/dbs/spfileXUXA.ora';
}
 
 
Engraçado que eu listo o backup do controlfile e ele me mostra:
 
RMAN list backup of controlfile;

List of Backup Sets
===
BS Key  Type LV Size   Device Type Elapsed Time Completion Time
---  -- -- ---  ---
426 Full    10.00M SBT_TAPE    00:00:07 22-JAN-14 
    BP Key: 438   Status: AVAILABLE  Compressed: NO  Tag: BACKUP_DIARIO
    Handle: full_XUXA_10_837522849_0aoun5d1_1   Media: 50253
  Control File Included: Ckp SCN: 10882503 Ckp time: 22-JAN-14
 
 
 
Estou logado no catálogo, com a instância no modo NOMOUNT e com o DBID setado.
 
 
Alguém pode ajudar?  Eu tinha realizado o teste de recuperação de desastre e 
nada disso ocorreu, estou achando estranho, pois estou realizando os mesmos 
procedimentos.

Re: [oracle_br] Índices no Oracle

2014-02-03 Por tôpico Sérgio Luiz Rodrigues Chaves
Yuri,

É importante informar qual a sua versão de Banco de Dados. Há muitas mudança 
significativas entre elas:
Features
Index fast full scan
Consideration of bitmap access to paths for tables with only B-tree indexes
Complex view merging
Peeking into user-defined bind variables
Index joins
Dynamic sampling
Query rewrite enables
Skip unusable indexes
Automatically compute index statistics as part of creation
Cost-based query transformations
Allow rewrites with multiple MVs and/or base tables
Adaptive cursor sharing
Use extended statistics to estimate selectivity
Use native implementation for full outer joins
Partition pruning using join filtering
Group by placement optimization
Null aware antijoins 
As 6 últimas somente no Oracle 11g.


Também é importante saber se o Banco de dados foi configurado para OLAP ou 
OLTP, visto que o otimizador e os parameters do banco são diferentes para cada 
um deles.

Verifique também se as estatísticas da tabela estão sendo coletadas.

Nos passe o plano de execução e as informações:
Selectivity = Number of rows satisfying a condition / Total number of rows
Selectivity is the estimated proportion of a row set retrieved by a particular 
predicate or combination of predicates.
It is expressed as a value between 0.0 and 1.0:
High selectivity: Small proportion of rows
Low selectivity: Big proportion of rows
Selectivity computation:
If no statistics: Use dynamic sampling
If no histograms: Assume even distribution of rows
Statistic information:
DBA_TABLES and DBA_TAB_STATISTICS (NUM_ROWS)
DBA_TAB_COL_STATISTICS (NUM_DISTINCT, DENSITY, HIGH/LOW_VALUE,…)

Cardinality = Selectivity * Total number of rows

Expected number of rows retrieved by a particular operation in the execution 
plan
Vital figure to determine join, filters, and sort costs
Simple example:

SELECT days FROM courses WHERE dev_name = 'ANGEL';

The number of distinct values in DEV_NAME is 203.
The number of rows in COURSES (original cardinality) is 1018.
Selectivity = 1/203 = 4.926*e-03
Cardinality = (1/203)*1018 = 5.01 (rounded off to 6)



Att.

Sérgio Chaves.


- Original Message -
From: Yuri Menon yuri.me...@gmail.com
To: oracle br oracle_br@yahoogrupos.com.br
Sent: Segunda-feira, 3 de Fevereiro de 2014 13:22:14
Subject: [oracle_br] Índices no Oracle











Boa tarde pessoal!

Podem me auxiliar por favor?

A seguinte consulta:

SELECT *
FROM TMOV
WHERE CODCXA = '12345'


Retorna 3500 registros e está muito lenta.

Em conta disso, criei um índice que aponta para TMOV.CODCXA

No entanto, esse índice só é utilizado quando dou APENAS um:
SELECT CODCXA FROM TMOV WHERE CODCXA = '12345'
não é utilizado para:
SELECT * FROM TMOV WHERE CODCXA = '12345'

A minha dúvida:
É normal isso no Oracle?

Se eu quiser fazer SELECT * terei de criar um índice que enxergue todos os 
campos?


Obs: tentei passar com HINT pra tentar forçar, mas não foi.

Desde já agradeço!





Re: [oracle_br] Índices no Oracle

2014-02-03 Por tôpico Sérgio Luiz Rodrigues Chaves
Yuri,

Veja também em http://www.devmedia.com.br/tuning-no-oracle-parte-02/16297.
 Nota 4

Nota 4. Seletividade de uma consulta

Podemos chamar seletividade como sendo a relação estabelecida entre a 
quantidade de linhas de uma tabela retornadas por uma consulta com a quantidade 
total de linhas da mesma tabela. É exatamente através da análise dessa 
seletividade que o Oracle decide entre usar um índice ou varrer todos os blocos 
de uma tabela. Por exemplo, imaginemos uma tabela com 1 milhão de linhas: se 
uma consulta na mesma retorna 900 mil linhas é muito mais rápido o Oracle 
varrer a tabela toda do que utilizar um índice. Apenas para termos um 
parâmetro, qualquer seletividade acima de 10% do valor total de linhas de uma 
tabela é considerada alta, e dificilmente o Oracle utilizará um índice nessa 
consulta..





Atenciosamente,



Sérgio Chaves .




- Mensagem original -
De: Sérgio Luiz Rodrigues Chaves sergio.cha...@elumini.com.br
Para: oracle br oracle_br@yahoogrupos.com.br
Enviadas: Mon, 03 Feb 2014 14:26:40 -0200 (BRST)
Assunto: Re: [oracle_br] Índices no Oracle

Yuri,

É importante informar qual a sua versão de Banco de Dados. Há muitas mudança 
significativas entre elas:
Features
Index fast full scan
Consideration of bitmap access to paths for tables with only B-tree indexes
Complex view merging
Peeking into user-defined bind variables
Index joins
Dynamic sampling
Query rewrite enables
Skip unusable indexes
Automatically compute index statistics as part of creation
Cost-based query transformations
Allow rewrites with multiple MVs and/or base tables
Adaptive cursor sharing
Use extended statistics to estimate selectivity
Use native implementation for full outer joins
Partition pruning using join filtering
Group by placement optimization
Null aware antijoins 
As 6 últimas somente no Oracle 11g.


Também é importante saber se o Banco de dados foi configurado para OLAP ou 
OLTP, visto que o otimizador e os parameters do banco são diferentes para cada 
um deles.

Verifique também se as estatísticas da tabela estão sendo coletadas.

Nos passe o plano de execução e as informações:
Selectivity = Number of rows satisfying a condition / Total number of rows
Selectivity is the estimated proportion of a row set retrieved by a particular 
predicate or combination of predicates.
It is expressed as a value between 0.0 and 1.0:
High selectivity: Small proportion of rows
Low selectivity: Big proportion of rows
Selectivity computation:
If no statistics: Use dynamic sampling
If no histograms: Assume even distribution of rows
Statistic information:
DBA_TABLES and DBA_TAB_STATISTICS (NUM_ROWS)
DBA_TAB_COL_STATISTICS (NUM_DISTINCT, DENSITY, HIGH/LOW_VALUE,…)

Cardinality = Selectivity * Total number of rows

Expected number of rows retrieved by a particular operation in the execution 
plan
Vital figure to determine join, filters, and sort costs
Simple example:

SELECT days FROM courses WHERE dev_name = 'ANGEL';

The number of distinct values in DEV_NAME is 203.
The number of rows in COURSES (original cardinality) is 1018.
Selectivity = 1/203 = 4.926*e-03
Cardinality = (1/203)*1018 = 5.01 (rounded off to 6)



Att.

Sérgio Chaves.


- Original Message -
From: Yuri Menon yuri.me...@gmail.com
To: oracle br oracle_br@yahoogrupos.com.br
Sent: Segunda-feira, 3 de Fevereiro de 2014 13:22:14
Subject: [oracle_br] Índices no Oracle











Boa tarde pessoal!

Podem me auxiliar por favor?

A seguinte consulta:

SELECT *
FROM TMOV
WHERE CODCXA = '12345'


Retorna 3500 registros e está muito lenta.

Em conta disso, criei um índice que aponta para TMOV.CODCXA

No entanto, esse índice só é utilizado quando dou APENAS um:
SELECT CODCXA FROM TMOV WHERE CODCXA = '12345'
não é utilizado para:
SELECT * FROM TMOV WHERE CODCXA = '12345'

A minha dúvida:
É normal isso no Oracle?

Se eu quiser fazer SELECT * terei de criar um índice que enxergue todos os 
campos?


Obs: tentei passar com HINT pra tentar forçar, mas não foi.

Desde já agradeço!






[oracle_br] RE: RMAN-06024: no backup or copy of the control file found to restore

2014-02-03 Por tôpico ederson2001br
Mandando a mesma sintaxe do SPFILE, o que acontece?
 

RESTORE CONTROLFILE TO  
'/u01/app/oracle/product/11.2.0.3/dbhome_1/dbs/control_teste.ora' FROM 
AUTOBACKUP db_name='nome_da_sua_instancia'; 

 

 Ederson Elias
 DBA Oracle
 http://br.linkedin.com/pub/ederson-elias/24/8b/8b0
 
 Labor improbus omnia vincit
 




Re: [oracle_br] Índices no Oracle

2014-02-03 Por tôpico Milton Bastos Henriquis Jr.
Sergio, é por isso mesmo que eu perguntei no e-mail anterior qual era a
quantidade total de linhas dessa tabela!

De repente é por isso que o índice não esteja sendo utilizado.


Em 3 de fevereiro de 2014 17:24, Sérgio Luiz Rodrigues Chaves 
sergio.cha...@elumini.com.br escreveu:



 Yuri,

 Veja também em http://www.devmedia.com.br/tuning-no-oracle-parte-02/16297.
 Nota 4

 Nota 4. Seletividade de uma consulta

 Podemos chamar seletividade como sendo a relação estabelecida entre a
 quantidade de linhas de uma tabela retornadas por uma consulta com a
 quantidade total de linhas da mesma tabela. É exatamente através da análise
 dessa seletividade que o Oracle decide entre usar um índice ou varrer todos
 os blocos de uma tabela. Por exemplo, imaginemos uma tabela com 1 milhão de
 linhas: se uma consulta na mesma retorna 900 mil linhas é muito mais rápido
 o Oracle varrer a tabela toda do que utilizar um índice. Apenas para termos
 um parâmetro, qualquer seletividade acima de 10% do valor total de linhas
 de uma tabela é considerada alta, e dificilmente o Oracle utilizará um
 índice nessa consulta..

 Atenciosamente,

 Sérgio Chaves .

 - Mensagem original -
 De: Sérgio Luiz Rodrigues Chaves sergio.cha...@elumini.com.br
 Para: oracle br oracle_br@yahoogrupos.com.br
 Enviadas: Mon, 03 Feb 2014 14:26:40 -0200 (BRST)
 Assunto: Re: [oracle_br] Índices no Oracle


 Yuri,

 É importante informar qual a sua versão de Banco de Dados. Há muitas
 mudança significativas entre elas:
 Features
 Index fast full scan
 Consideration of bitmap access to paths for tables with only B-tree indexes
 Complex view merging
 Peeking into user-defined bind variables
 Index joins
 Dynamic sampling
 Query rewrite enables
 Skip unusable indexes
 Automatically compute index statistics as part of creation
 Cost-based query transformations
 Allow rewrites with multiple MVs and/or base tables
 Adaptive cursor sharing
 Use extended statistics to estimate selectivity
 Use native implementation for full outer joins
 Partition pruning using join filtering
 Group by placement optimization
 Null aware antijoins 
 As 6 últimas somente no Oracle 11g.

 Também é importante saber se o Banco de dados foi configurado para OLAP ou
 OLTP, visto que o otimizador e os parameters do banco são diferentes para
 cada um deles.

 Verifique também se as estatísticas da tabela estão sendo coletadas.

 Nos passe o plano de execução e as informações:
 Selectivity = Number of rows satisfying a condition / Total number of rows
 Selectivity is the estimated proportion of a row set retrieved by a
 particular predicate or combination of predicates.
 It is expressed as a value between 0.0 and 1.0:
 High selectivity: Small proportion of rows
 Low selectivity: Big proportion of rows
 Selectivity computation:
 If no statistics: Use dynamic sampling
 If no histograms: Assume even distribution of rows
 Statistic information:
 DBA_TABLES and DBA_TAB_STATISTICS (NUM_ROWS)
 DBA_TAB_COL_STATISTICS (NUM_DISTINCT, DENSITY, HIGH/LOW_VALUE,...)
 
 Cardinality = Selectivity * Total number of rows

 Expected number of rows retrieved by a particular operation in the
 execution plan
 Vital figure to determine join, filters, and sort costs
 Simple example:

 SELECT days FROM courses WHERE dev_name = 'ANGEL';

 The number of distinct values in DEV_NAME is 203.
 The number of rows in COURSES (original cardinality) is 1018.
 Selectivity = 1/203 = 4.926*e-03
 Cardinality = (1/203)*1018 = 5.01 (rounded off to 6)

 Att.

 Sérgio Chaves.

 - Original Message -
 From: Yuri Menon yuri.me...@gmail.com
 To: oracle br oracle_br@yahoogrupos.com.br
 Sent: Segunda-feira, 3 de Fevereiro de 2014 13:22:14
 Subject: [oracle_br] Índices no Oracle

 Boa tarde pessoal!

 Podem me auxiliar por favor?

 A seguinte consulta:

 SELECT *
 FROM TMOV
 WHERE CODCXA = '12345'

 Retorna 3500 registros e está muito lenta.

 Em conta disso, criei um índice que aponta para TMOV.CODCXA

 No entanto, esse índice só é utilizado quando dou APENAS um:
 SELECT CODCXA FROM TMOV WHERE CODCXA = '12345'
 não é utilizado para:
 SELECT * FROM TMOV WHERE CODCXA = '12345'

 A minha dúvida:
 É normal isso no Oracle?

 Se eu quiser fazer SELECT * terei de criar um índice que enxergue todos
 os campos?

 Obs: tentei passar com HINT pra tentar forçar, mas não foi.

 Desde já agradeço!

  



Re: [oracle_br] RE: RMAN-06024: no backup or copy of the control file found to restore

2014-02-03 Por tôpico Rafael Mendonca
Esderson meu brother, acho que descobri o motivo desse erro está acontecendo, 
veja se estou corrento, por favor.
 
Eu já havia realizado um teste, ontem mesmo,de desastre conforme o tópico 
anterior no qual você o chiappa me ajudaram mandando umas dicas e o script, 
então só fiz ajustar os scripts enviados para o meu cenário e funcionou tudo 
corretamente, abrindo o database no final com resetlogs.
 
Daí eu dropei a base novamente para fazer o teste novamente só que desta vez 
homologando e ageitando os scripts para documentação, só que quando chegou na 
hora do restore do controlfile me deu esse erro, será que o motivo é por conta 
do RESETLOGS? Da nova incarnãção que ficou guardada no catálogo? 
 
 



Em Segunda-feira, 3 de Fevereiro de 2014 16:50, ederson200...@yahoo.com.br 
ederson200...@yahoo.com.br escreveu:
  
  
Mandando a mesma sintaxe do SPFILE, o que acontece?
RESTORE CONTROLFILE TO  
'/u01/app/oracle/product/11.2.0.3/dbhome_1/dbs/control_teste.ora' FROM 
AUTOBACKUP db_name='nome_da_sua_instancia';



Ederson Elias
DBA Oracle
http://br.linkedin.com/pub/ederson-elias/24/8b/8b0

Labor improbus omnia vincit
  
 

Re: [oracle_br] RE: RMAN-06024: no backup or copy of the control file found to restore

2014-02-03 Por tôpico Rafael Mendonca
Era isso mesmo Ederson, era o que eu estava prevendo, realizei um LIST 
INCARNATION; e setei para a incarnação anterior, agora consegui restaurar o 
controlfile, pois já tinha aberto o database com resetlogs anteriormente.




Em Segunda-feira, 3 de Fevereiro de 2014 17:13, Rafael Mendonca 
raffaell.t...@yahoo.com escreveu:

 
Esderson meu brother, acho que descobri o motivo desse erro está acontecendo, 
veja se estou corrento, por favor.
 
Eu já havia realizado um teste, ontem mesmo,de desastre conforme o tópico 
anterior no qual você o chiappa me ajudaram mandando umas dicas e o script, 
então só fiz ajustar os scripts enviados para o meu cenário e funcionou tudo 
corretamente, abrindo o database no final com resetlogs.
 
Daí eu dropei a base novamente para fazer o teste novamente só que desta vez 
homologando e ageitando os scripts para documentação, só que quando chegou na 
hora do restore do controlfile me deu esse erro, será que o motivo é por conta 
do RESETLOGS? Da nova incarnãção que ficou guardada no catálogo?
 
 



Em Segunda-feira, 3 de Fevereiro de 2014 16:50, ederson200...@yahoo.com.br 
ederson200...@yahoo.com.br escreveu:

 
Mandando a mesma sintaxe do SPFILE, o que acontece?
RESTORE CONTROLFILE TO  
'/u01/app/oracle/product/11.2.0.3/dbhome_1/dbs/control_teste.ora' FROM 
AUTOBACKUP db_name='nome_da_sua_instancia';



Ederson Elias
DBA Oracle
http://br.linkedin.com/pub/ederson-elias/24/8b/8b0

Labor improbus omnia vincit



 

Re: [oracle_br] Índices no Oracle

2014-02-03 Por tôpico jlchiappa
 Colega, tudo jóia ? Sim, ainda estou vivo , e de vez em quando ainda passo por 
aqui :)
 
 Sobre as suas perguntas , seguinte : NÃO, não é verdade que Obrigatoriamente 
um SELECT * força um full-table scan, e para a idéia de que seria preciso 
indexar todas as colunas para que um SELECT * usar índice, a resposta é : 
bullshit, bobeira, absurdo, ridículo, siiim ??
  Aliàs, antes de demonstrar, vamos pensar juntos : um índice ** não ** acelera 
uma consulta por magia de unicórnio ou pó de pirlimpimpim : entre outras coisas 
(como a questão de organização interna que permite busca por 'poda' de 
valores), o fato é que um índice simplesmente é uma tabela reduzida, que tem 
só as colunas-chave e o rowid de cada linha, assim é por isso que uma busca no 
índice é mais rápida, o índice é MUITÍSSIMO MENOR, né ?? Vc não acha que se vc 
criar um índice com TODAS as colunas da tabela, vc não acaba tendo uma 
estrutura de tamanho + ou - similar à da tabela ??? Que vantagem Maria leva 
 
 
 Segundo ponto : o RDBMS Oracle (ao menos desde a versão 8i, mas principalmente 
a partir do 9i) largou mão de otimização RBO e adotou a CBO, ie : ele ** não ** 
adivinha, ** não ** usa regras para decidir se usa ou não o índice, se é mais 
vantajoso ler a tabela de uma vez ou se é melhor ler o índice : ele usa as 
ESTATÍSTICAS que indicam quantos registros serão retornadas ao se filtrar por 
cada coluna COM o valor indicado no WHERE, okdoc ??
  ENTÃO, necessariamente se o seu índice não está sendo usado, MUITO 
RPOVAVELMENTE o valor que vc informou retorna uma grande qtdade de linhas e 
então compensa mais partir pro FTS, ** OU ** as estatísticas não registram a 
distribuição de dados corretas

  A minha demonstração (num banco 10.2.0.5 EE no caso) :

= crio a tabela e preencho com dados :

SQL set lines 200 pages 5

SQL create table TAB_TESTE as (select * from dba_objects where 1=2);

Tabela criada.

SQL alter table TAB_TESTE parallel 4;

SQL insert /*+ APPEND */ into TAB_TESTE (select * from dba_objects);

51496 linhas criadas.

SQL commit;

Commit concluido.

SQL insert /*+ APPEND */ into TAB_TESTE (select * from dba_objects);

51496 linhas criadas.

SQL commit;

Commit concluido.


== okdoc , vamos ter na coluna indexada um valor RARO, que traz POUQUÍSSIMAS 
linhas, e assim vale a pena ser recuperado por índice :


SQL insert into TAB_TESTE (owner) values('CHIAPPA');

1 linha criada.


SQL commit
  2  ;

Commit concluido.

= crio o índice :

SQL create index IDX_TESTE_OWNER on TAB_TESTE(owner);

Indice criado.

 Óia isso : select * usando o índice :

SQL set autotrace on
SQL select * from TAB_TESTE where owner='CHIAPPA';

OWNER
--
OBJECT_NAME

SUBOBJECT_NAME  OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE
-- -- -- ---
CREATED  LAST_DDL TIMESTAMP   STATUS  T G S
  --- --- - - -
CHIAPPA






Plano de Execuc?o
--
Plan hash value: 1974746346


---

| Id  | Operation   | Name| Rows  | Bytes | Cost (%C
PU)| Time |


---

|   0 | SELECT STATEMENT| | 1 |   177 | 2
(0)| 00:00:01 |

|   1 |  TABLE ACCESS BY INDEX ROWID| TAB_TESTE   | 1 |   177 | 2
(0)| 00:00:01 |

|*  2 |   INDEX RANGE SCAN  | IDX_TESTE_OWNER | 1 |   | 1
(0)| 00:00:01 |


---


Predicate Information (identified by operation id):
---

   2 - access(OWNER='CHIAPPA')

Note
-
   - dynamic sampling used for this statement


Estatistica
--
  9  recursive calls
  0  db block gets
 74  consistent gets
  1  physical reads
  0  redo size
   1354  bytes sent via SQL*Net to client
492  bytes received via SQL*Net from client
  2  SQL*Net roundtrips to/from client
  0  sorts (memory)
  0  sorts (disk)
  1  rows processed

== agora a contra-prova : um valor do índice que SEI que é repetido milhares 
de vezes :
  
SQL select * from TAB_TESTE where owner='SYS';

.

SYS
/a7359489_XDBServletContainer
38589JAVA CLASS
08/07/13 08/07/13 2013-07-08:17:21:51 VALID   N N N

SYS
oracle/xdb/spi/XDBResource
38590JAVA CLASS
08/07/13 08/07/13 2013-07-08:17:21:51 VALID   N N N

SYS
oracle/xdb/spi/Resource