¿Qué es el índice virtual en Oracle?
- Un índice virtual es un índice "falso" cuya definición existe en el diccionario de datos, pero no tiene un segmento de índice asociado.
- Muchas veces el asesor de ajuste de SQL le recomienda crear un nuevo índice y desea probar el nuevo índice. En este caso, puede tomar una buena cantidad de tiempo agregar índices a tablas grandes y consumirá mucho espacio en disco también si la tabla es grande. Además, los índices adicionales están disponibles para que los usen otras sesiones, lo que puede afectar el rendimiento de otras partes. de su aplicación que no está probando actualmente. Esto puede ser especialmente problemático cuando intenta identificar problemas en un sistema de producción. Los índices virtuales resuelven este problema
- El propósito de los índices virtuales es simular la existencia de un índice, sin construir realmente un índice completo
- Esto permite a los desarrolladores ejecutar un plan de explicación como si el índice estuviera presente sin esperar a que se complete la creación del índice y sin usar espacio de disco adicional.
- Podemos analizar índices virtuales.
- No puede reconstruir un índice virtual; arroja un ORA-8114:"El usuario intentó modificar un índice falso"
- Puede soltar el índice como si fuera un índice normal.
SQL> drop index <index_name>;
Puntos importantes para recordar
(1) Necesitamos establecer "_USE_NOSEGMENT_INDEXES" en verdadero a nivel de sesión para usar esta función
(2) Los índices virtuales se crean con la adición de una parte sin segmento al final del script de creación de índices
Ejemplo para demostrar el uso de Virtual Index en Oracle
(1) Cree una tabla de muestra, digamos virtual_test_t
SQL> create table virtual_test_t as select * from dba_objects where rownum < 100000;
(2) Seleccione cualquier valor de la tabla
SQL> select * from virtual_test_t where object_name = 'FND_PROFILE';
(3) Consulte el plan de explicación de Oracle para la 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) Cree un índice virtual en la tabla creada.
SQL> create index test_index_v on virtual_test_t(object_name) nosegment;
Recuerde, para crear un índice virtual, debe especificar la cláusula NOSEGMENT en la declaración CREATE INDEX.
También tenga en cuenta que al ejecutar la declaración anterior, no se crea un segmento de índice.
(5) Puede verificar lo mismo con lo siguiente:
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';
Entonces, el objeto existe en la base de datos, pero no tenemos un segmento para el mismo.
(6) Ahora ejecute lo mismo para comprobar si se está utilizando el índice.
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 el índice no está siendo utilizado.
(7) Para hacer uso del índice virtual creado, debemos establecer el parámetro _USE_NOSEGMENT_INDEXES en verdadero.
SQL> alter session set "_USE_NOSEGMENT_INDEXES" = true;
Session altered.
(8) Ahora, ejecute la misma sentencia 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 |
Una vez que configure este parámetro oculto, el optimizador de Oracle comenzará a usar el índice virtual que creó en esta tabla.
Si ejecuta esta consulta desde cualquier otra sesión, no usará este índice virtual (como hemos usado "alterar sesión”).