Como usar Índices Virtuais – NOSEGMENT INDEXES
25/09/2007
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