Pourquoi oracle CHOISIR INDEX RANGE SCAN plus RAPIDE ANALYSE d'INDEX
J'ai lu de la documentation sur les indices, j'ai fait quelques exemples et maintenant j'ai quelques doutes.
- Je créer un tableau et insérer des valeurs aléatoires, (Une colonne de valeurs uniques) de la colonne not NULL
J'ai créer un index sur A, B, C. (B-TREE)
SELECT COUNT(*) FROM DEMO_FULL_INDEX_SCAN;
=1000
SELECT * FROM DEMO_FULL_INDEX_SCAN;
A B C D E F
---------- ---------- ---------- ---------- ---------- ----------
1 7 109 1 1 1
2 12 83 2 2 2
3 21 120 3 3 3
4 13 74 4 4 4
5 2 1 5 5 5
...
Documentation dit lorsque toutes les requêtes des valeurs de l'indice, les valeurs sont recueillies à partir de l'index (INDEX RAPIDE BALAYAGE COMPLET), mais ici, l'optimiseur est faire le choix d'une autre opération.
EXPLAIN PLAN FOR
SELECT A,B,C FROM DEMO_FULL_INDEX_SCAN WHERE A = 1;
--------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | |
|* 1 | INDEX RANGE SCAN | FIS_01 | | | |
--------------------------------------------------------------------
- Je spécifier une allusion à l'optimiseur de choisir l'INDICE de FAST SCAN COMPLET (mais je ne sais pas pourquoi je dois le préciser)
EXPLAIN PLAN FOR
SELECT /*+ INDEX_FFS(DEMO_FULL_INDEX_SCAN FIS_01) */A,B,C FROM DEMO_FULL_INDEX_SCAN WHERE A = 1;
--------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 11 | 2 |
|* 1 | INDEX FAST FULL SCAN| FIS_01 | 1 | 11 | 2 |
--------------------------------------------------------------------
Par l'autre main ,cet exemple montre que la documentation d'oracle dit.
Quand il ya une valeur dans la requête qui n'est pas dans l'index, cette valeur est accessible par TABLE ACCESS BY INDEX ROWID
EXPLAIN PLAN FOR
SELECT D FROM DEMO_FULL_INDEX_SCAN WHERE A = 800;
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Co
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | |
| 1 | TABLE ACCESS BY INDEX ROWID| DEMO_FULL_INDEX_SCAN | | |
|* 2 | INDEX RANGE SCAN | FIS_01 | | |
--------------------------------------------------------------------------------
Ma question est ,dans le premier exemple, pourquoi Oracle CHOISIR INDEX RANGE SCAN plus RAPIDE ANALYSE d'INDEX.
Vous devez vous connecter pour publier un commentaire.
Vous effectuez un INDEX RANGE SCAN en raison de la clause where de l'instruction SQL:
Je suppose ici que vous n'avez pas un index unique sur une malgré le caractère unique de la colonne, c'est à dire votre table DDL est quelque chose comme ceci:
Que vous n'avez pas un index UNIQUE Oracle ne peut pas savoir avec certitude que les valeurs dans Un sera toujours unique; toutefois, Oracle ne savez que c'est la première colonne de l'index et de pouvez trouver cette valeur dans la plage de valeurs disponibles dans l'index.
Si votre clause where étaient pour tenter de filtrer sur la base de la colonne C, vous effectuez un INDEX SCAN COMPLET que C existe dans l'index, de sorte que vous n'avez pas besoin d'accéder à la table, mais ce n'est pas la première colonne de l'index: