[Dica] Índices Virtuais - NOSEGMENT

Tuning de Banco, Tuning de SQL, Ferramentas de tuning
Responder
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

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!

Selecionar tudo

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

Selecionar tudo

SQL> create index emp_vir_idx1 on emp(name) nosegment;

Index created.
Vamos ver se ele vai usar:

Selecionar tudo

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".

Selecionar tudo

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)
Nites
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Qua, 05 Mar 2008 4:16 pm
Localização: Joinville/SC

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
ruevers
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 324
Registrado em: Sex, 02 Jun 2006 1:48 pm
Localização: sp
Contato:

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.
Renan Orati
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 90
Registrado em: Qui, 23 Ago 2007 3:40 pm
Localização: São José do Rio Preto - SP

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!!!
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

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!
ruevers
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 324
Registrado em: Sex, 02 Jun 2006 1:48 pm
Localização: sp
Contato:

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.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 5 visitantes