Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment utiliser l'index virtuel dans la base de données Oracle

Qu'est-ce que l'index virtuel dans Oracle ?

  • Un index virtuel est un "faux" index dont la définition existe dans le dictionnaire de données, mais qui n'a pas de segment d'index associé.
  • Souvent, sql tuning advisor vous recommande de créer un nouvel index et vous souhaitez tester le nouvel index. Dans ce cas, l'ajout d'index à de grandes tables peut prendre beaucoup de temps et consommera également beaucoup d'espace disque si la table est grande. De plus, les index supplémentaires sont disponibles pour être utilisés par d'autres sessions, ce qui peut affecter les performances d'autres parties. de votre application que vous n'êtes pas en train de tester. Cela peut être particulièrement problématique lorsque vous essayez d'identifier des problèmes sur un système de production. Les index virtuels résolvent ce problème
  • Le but des index virtuels est de simuler l'existence d'un index, sans réellement créer un index complet
  • Cela permet aux développeurs d'exécuter un plan d'exécution comme si l'index était présent sans attendre la fin de la création de l'index et sans utiliser d'espace disque supplémentaire.
  • Nous pouvons analyser les index virtuels.
  • Vous ne pouvez pas reconstruire un index virtuel ; il lance un ORA-8114 :"L'utilisateur a tenté de modifier un faux index"
  • Vous pouvez supprimer l'index comme un index normal.
SQL> drop index <index_name>;

Points importants à retenir

(1) Nous devons définir "_USE_NOSEGMENT_INDEXES" sur true au niveau de la session pour utiliser cette fonctionnalité
(2) Les index virtuels sont créés avec l'ajout d'une partie sans segment à la fin du script de création d'index

Exemple pour démontrer l'utilisation de Virtual Index dans Oracle

(1) Créez un exemple de table, dites virtual_test_t

SQL> create table virtual_test_t as select * from dba_objects where rownum < 100000;

(2) Sélectionnez une valeur dans le tableau

SQL> select * from virtual_test_t where object_name = 'FND_PROFILE';

(3) Vérifiez le plan Oracle Explain pour la requête 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) Créer un index virtuel sur la table créée.

SQL> create index test_index_v on virtual_test_t(object_name) nosegment;

N'oubliez pas que pour créer un index virtuel, vous devez spécifier la clause NOSEGMENT dans l'instruction CREATE INDEX.
Notez également qu'en exécutant l'instruction ci-dessus, un segment d'index n'est pas créé.

(5) Vous pouvez vérifier la même chose avec ce qui suit :

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';

Ainsi, l'objet existe dans la base de données, mais nous n'avons pas de segment pour le même.

(6) Maintenant, exécutez la même chose pour vérifier si l'index est utilisé.

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 |

Nous pouvons clairement observer que l'index n'est pas utilisé.

(7) Pour utiliser l'index virtuel créé, nous devons définir le paramètre _USE_NOSEGMENT_INDEXES sur true.

SQL> alter session set "_USE_NOSEGMENT_INDEXES" = true;
Session altered.

(8) Maintenant, exécutez la même instruction 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 |

Une fois que vous avez défini ce paramètre masqué, l'optimiseur oracle commencera à utiliser l'index virtuel que vous avez créé sur cette table.
Si vous exécutez cette requête à partir d'une autre session, il n'utilisera pas cet index virtuel (comme nous l'avons utilisé "alter session ").