Aprenda PL/SQL

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 fisicamente. Nada será armazenado nem acessado!

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

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

Index created.

Agora, vamos ver se ele vai usar:

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)

Hei! Acesso FULL? Porque o oracle não está usando meu novo í­ndice?
Você deve primeiro alterar sua sessão com o parâmetro oculto “_use_nosegment_indexes”.

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) 

Comente aqui

One Response

  1. […] 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)   Fonte:http://glufke.net/2007/09/25/como-usar-indices-virtuais-nosegment-indexes/ […]