Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como usar o índice virtual no banco de dados Oracle

O que é  Índice virtual no Oracle?

  • Um índice virtual é um índice “falso” cuja definição existe no dicionário de dados, mas não possui um segmento de índice associado.
  • Muitas vezes o sql tuning advisor recomenda a criação de um novo índice e você deseja testar o novo índice. Nesse caso, pode levar um bom tempo para adicionar índices a tabelas grandes e consumirá muito espaço em disco também se a tabela for grande. Além disso, os índices adicionais estão disponíveis para uso por outras sessões, o que pode afetar o desempenho de outras partes do seu aplicativo que você não está testando no momento. Isso pode ser especialmente problemático quando você está tentando identificar problemas em um sistema de produção. Índices virtuais resolvem esse problema
  • O objetivo dos índices virtuais é simular a existência de um índice – sem realmente construir um índice completo
  • Isso permite que os desenvolvedores executem um plano de explicação como se o índice estivesse presente, sem aguardar a conclusão da criação do índice e sem usar espaço em disco adicional.
  • Podemos analisar índices virtuais.
  • Você não pode reconstruir um índice virtual; lança um ORA-8114:“Usuário tentou alterar um índice falso”
  • Você pode descartar o índice como um índice normal.
SQL> drop index <index_name>;

Pontos importantes a serem lembrados


(1) Precisamos definir “_USE_NOSEGMENT_INDEXES” para true no nível da sessão para usar esse recurso
(2) Os índices virtuais são criados com a adição de uma porção sem segmento no final do script de criação do índice

Exemplo para demonstrar o uso do Índice Virtual no Oracle


(1) Crie uma tabela de amostra, digamos virtual_test_t
SQL> create table virtual_test_t as select * from dba_objects where rownum < 100000;

(2) Selecione qualquer valor da tabela
SQL> select * from virtual_test_t where object_name = 'FND_PROFILE';

(3) Verifique o plano de explicação do oráculo para a consulta SELECT.
SQL> set autotrace traceonly explain
SQL> select * from virtual_test_t where object_name = 'FND_PROFILE';
Execution Plan
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 8 | 1416 | 156 (2)| 00:00:02 |
|* 1 | TABLE ACCESS FULL| VIRTUAL_TEST_T | 8 | 1416 | 156 (2)| 00:00:02 |

(4) Crie um índice virtual na tabela criada.
SQL> create index test_index_v on virtual_test_t(object_name) nosegment;

Lembre-se, para criar um índice virtual, você precisa especificar a cláusula NOSEGMENT na instrução CREATE INDEX.
Observe também que, executando a instrução acima, um segmento de índice não é criado.

(5) Você pode verificar o mesmo com o seguinte:
SQL> set autotrace off
SQL> select index_name from dba_indexes where table_name = 'VIRTUAL_TEST_T' and index_name = 'TEST_INDEX_V';

no rows selected

SQL> col OBJECT_NAME format a20;
SQL> select object_name, object_type from dba_objects where object_name = 'TEST_INDEX_V';

Então, o objeto existe no banco de dados, mas não temos segmento para o mesmo.

(6) Agora execute o mesmo para verificar se o índice está sendo utilizado.
SQL> set autotrace traceonly explain
SQL> select * from virtual_test_t where object_name = 'FND_PROFILE';
Execution Plan
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 8 | 1416 | 156 (2)| 00:00:02 |
|* 1 | TABLE ACCESS FULL| VIRTUAL_TEST_T | 8 | 1416 | 156 (2)| 00:00:02 |

Podemos observar claramente que o índice não está sendo utilizado.

(7) Para fazer uso do índice virtual criado, precisamos definir o parâmetro _USE_NOSEGMENT_INDEXES para true.
SQL> alter session set "_USE_NOSEGMENT_INDEXES" = true;
Session altered.

(8) Agora, execute a mesma instrução SELECT.
SQL> select * from virtual_test_t where object_name = 'FND_PROFILE';
Execution Plan
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 8 | 1416 | 5 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| VIRTUAL_TEST_T | 8 | 1416 | 5 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | TEST_INDEX_V | 216 | | 1 (0)| 00:00:01 |

Depois de definir esse parâmetro oculto, o otimizador oracle começará a usar o índice virtual que você criou nesta tabela.
Se você executar essa consulta de qualquer outra sessão, ele não usará esse índice virtual (como usamos "alterar sessão”).