dimanche 4 octobre 2015

INDEX VIRTUEL


Un index virtuel est un index que l'on déclare sans qu'il ne soit physiquement créé.  Une simulation d'un index. En effet dans bien des cas et principalement dans les environnements de prod on peut vouloir tester un index pour voir s'il améliore les performances sans impacter la production
Avec une consommation cpu, IO et stockage.

Considérons la requête suivante :

SQL> EXPLAIN PLAN FOR
2 SELECT * FROM sh.sales WHERE quantity_sold > 10000
3 /

Explained.

SQL> SELECT *
2 FROM TABLE (DBMS_XPLAN.display (NULL, NULL, 'BASIC +COST'))
3 /
--------------------------------------------------
| Id | Operation | Name | Cost (%CPU)|
--------------------------------------------------
| 0 | SELECT STATEMENT | | 441 (12)|
| 1 | PARTITION RANGE ALL| | 441 (12)|
| 2 | TABLE ACCESS FULL | SALES | 441 (12)|
-------------------------------------------------


Nous avons un table access full sur la table SALES.  On peut se poser la question si un index serai pas plus performant.

SQL> ALTER SESSION SET "_use_nosegment_indexes"=TRUE;

Session altered.

SQL> CREATE INDEX sh.sales_vi1 ON sh.sales(quantity_sold) NOSEGMENT;

Index created.

L'option NOSEGMENT indique qu'il s'agit d'un index virtuel.

On execute de nouveau la requête :

SQL> EXPLAIN PLAN FOR
2 SELECT * FROM sh.sales WHERE quantity_sold > 10000;

Explained.

SQL> SELECT *
2 FROM TABLE (DBMS_XPLAN.display (NULL, NULL, 'BASIC +COST'));

| Id | Operation | Name | Cost (%CPU)|
---------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3 (0)|
| 1 | TABLE ACCESS BY GLOBAL INDEX ROWID| SALES | 3 (0)|
| 2 | INDEX RANGE SCAN | SALES_VI1 | 2 (0)|
---------------------------------------------------------------------

On peut voir dans le plan d'exécution l'utilisation de l'index et l'optimisation qu'il apporte : le coût passe de 441 to 3 on peut donc conseiller la création d'un tel index ou le créer physiquement.




1 commentaire: