FAQ Procura Membros Registre-se Perfil MP's Login/Out
[Dica] Índices Virtuais - NOSEGMENT

 
Novo Tópico   Responder Mensagem    glufke.net - Índice do Fórum -> SQL
Mensagem Autor
Enviada: Seg, 06 Jun 2005 5:02 pm     Assunto: [Dica] Índices Virtuais - NOSEGMENT

Essa é para quem faz tunning de SQL:

Digamos que você quer verificar se a criação de um novo índice vai ser realmente usada pelo otimizador. Antes de criá-lo, você pode testar se ele resolverá seu problema atraves de INDICE VIRTUAL.

O Oracle vai criar o índice no dicionário de dados mas não vai criar o índice mesmo. Nada será armazenado nem acessado!

Código:
SQL> set autotrace traceonly explain

SQL> select name from emp where name = 'Alex';

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=164 Card=1 Bytes=500)
   1    0   TABLE ACCESS (FULL) OF 'EMP' (Cost=164 Card=1 Bytes=500)


Criando o índice

Código:
SQL> create index emp_vir_idx1 on emp(name) nosegment;

Index created.


Vamos ver se ele vai usar:
Código:
SQL> set autotrace traceonly explain

SQL> select name from emp where name = 'Alex';

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=164 Card=1 Bytes=500)
   1    0   TABLE ACCESS (FULL) OF 'EMP' (Cost=164 Card=1 Bytes=500)


Ei, porque o oracle não está usando meu novo índice? Ahá, você deve primeiro alterar sua sessão com o parâmetro oculto "_use_nosegment_indexes".

Código:
SQL> alter session set "_use_nosegment_indexes" = true;

Session altered.

SQL> select name from emp where name = 'Alex';

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=500)
   1    0   INDEX (RANGE SCAN) OF 'EMP_VIR_IDX1' (NON-UNIQUE) (Cost=1 Card=1 Bytes=500)


_________________
Thomas F. G.
Campanha: Faça uma pesquisa antes de perguntar!!!
dr_gori
Moderador
Moderador


Registrado em: Seg, 3 de Mai de 2004
Mensagens: 3220
Cidade - UF: Porto Alegre - RS


Enviada: Qua, 05 Mar 2008 4:24 pm    

Opa,

eu estive pesquisando sobre esse tipo de indice("indice virtual") e fiz alguns testes aqui na minha base.
E por mais que testei, cheguei a conclusão que aqui na minha base não está funcionando.
Quanod executo o explain da query, o indice virtual até é mostrado e o custo da maquina diminui.
Porem o ganho de tempo de execução não altera em nada. Se eu coloc para executar sem o indice virtual(Acesso FULL), leva 3 minutos. Com o indice Virtual, leva os mesmo 3 minutos.
Fiz o teste e criei um indice normal, sem a opção de nosegment. Com esse indice normal, a query executou muito bem. O explain dela ficou utilizando o novo indice eo tempo diminuiu para 15 segundos aproximandamente.

O que será que tem de errado???é alguma configuração de banco???
O banco que estou trabalhando é o 10g Release 10.2.0.3.0.

valewsssssssss
Nites
Rank: Estagiário Júnior
Rank: Estagiário Júnior


Registrado em: Qua, 5 de Março de 2008
Mensagens: 1
Cidade - UF: Joinville/SC


Enviada: Sex, 07 Mar 2008 12:39 pm    

To chutando, depois vou pesquisar melhor esse assunto, mas acho que o objetivo dele seria ver se o Oracle usa o indice no plano de execução e não deve mesmo melhorar o tempo...porque afinal de contas ele não existe, não tem segmentos.

Alguém sabe sobre mais esse assunto?? Hoje é sexta e estou com preguiça de pesquisar.
_________________
Anderson
DBA Sr.
http://www.ruevers.webs.com
ruevers
Rank: DBA Sênior
Rank: DBA Sênior


Registrado em: Sex, 2 de Junho de 2006
Mensagens: 322
Cidade - UF: sp


Enviada: Sáb, 08 Mar 2008 8:26 am     Assunto: bom dia!

Olá povo!!! beleza??

Eu estou querendo fazer minha monografia da faculdade sobre o tema "SQL performance Tunning"!!!

Eu gostaria de saber se alguém tem material pra me passar... ou livro pra recomendar!! porque a maioria do material que encontro é ingles...

vlw!!!
_________________
Renan Orati
Renan Orati
Rank: Analista Júnior
Rank: Analista Júnior


Registrado em: Qui, 23 de Agosto de 2007
Mensagens: 87
Cidade - UF: Fernandópolis - SP


Enviada: Sáb, 08 Mar 2008 9:45 am    

ruevers escreveu:
o objetivo dele seria ver se o Oracle usa o indice no plano de execução e não deve mesmo melhorar o tempo...porque afinal de contas ele não existe, não tem segmentos.

Alguém sabe sobre mais esse assunto?? Hoje é sexta e estou com preguiça de pesquisar.


É exatamente isso! Ele não cria o índice! O índice não existe! Só é criado no dicionário de dados. Assim podemos ver se o índice vai melhorar uma consulta ou não, através do plano de execução.

Imagine uma tabela com 100 milhões de linhas, e você tem que fazer tuning nela. Ficar criando índices pra lá e pra cá de 100 milhões vai acabar com o banco! Provavelmente esse tipo de coisa nem seja permitido de fazer em qualquer horário. Daí você cria o índice no-segment e testa a vontade a criação de índices e consultas.

Depois que viu que funciona, basta criá-lo fisicamente!
_________________
Thomas F. G.
Campanha: Faça uma pesquisa antes de perguntar!!!
dr_gori
Moderador
Moderador


Registrado em: Seg, 3 de Mai de 2004
Mensagens: 3220
Cidade - UF: Porto Alegre - RS


Enviada: Seg, 10 Mar 2008 11:54 am    

Fiquei preocupado no final de semana com meu chute...achei que tinha dado bola fora, mas como sempre eu e o Oracle estamos conectados mentalmente...rsrsr
O amigo que perguntou sobre material de tunning, eu sempre indico as video aulas, é bom pra começar, tem o básico e depois você pode continuar sozinho.
Aqui no site tem elas, na parte de tutorial explica como adquirir.
_________________
Anderson
DBA Sr.
http://www.ruevers.webs.com
ruevers
Rank: DBA Sênior
Rank: DBA Sênior


Registrado em: Sex, 2 de Junho de 2006
Mensagens: 322
Cidade - UF: sp


Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    glufke.net - Índice do Fórum -> SQL Todos os horários são GMT - 3 Hours
Página 1 de 1

 
 
. .