Bonjour,
J'ai une requête utilisant une fonction (voir plus bas). Afin d'améliorer les performances, j'ai ajouter un indexe basé sur cette fonction, mais le moteur Oracle ne l'utilise pas, et lorsque je force l'utilisation de cet indexe via un HINT, je vois que le moteur Oracle a raison mais ne comprend pas. Voici le détail :
Voici le 1er plan :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
explain plan for SELECT
  NVL(DOSSIER,'VIDE' ) AS T1
FROM
  MA_TABLE
GROUP BY
   NVL(DOSSIER,'VIDE')
ORDER BY
   T1 ASC;
 
 
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------
Plan hash value: 4111865712
 
--------------------------------------------------------------------------------------------------
| Id  | Operation           | Name                       | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |                            |   364 |  2912 | 13002  (10)| 00:02:37 |
|   1 |  SORT ORDER BY      |                            |   364 |  2912 | 13002  (10)| 00:02:37 |
|   2 |   HASH GROUP BY     |                            |   364 |  2912 | 13002  (10)| 00:02:37 |
|   3 |    TABLE ACCESS FULL| MA_TABLE                   |  2235K|    17M| 12256   (4)| 00:02:28 |
--------------------------------------------------------------------------------------------------
Second plan avec HINT sur l'indexe de fonction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
explain plan for SELECT /*+ INDEX(MA_TABLE IDX_NVL_MA_TABLE_ASC) */
  NVL(DOSSIER,'VIDE' ) AS T1
FROM
  MA_TABLE
GROUP BY
   NVL(DOSSIER,'VIDE')
ORDER BY
   T1 ASC;
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------
Plan hash value: 1625393906
 
------------------------------------------------------------------------------------------------
| Id  | Operation             | Name                   | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |                        |   364 |  2912 |   373K  (1)| 01:14:48 |
|   1 |  SORT ORDER BY        |                        |   364 |  2912 |   373K  (1)| 01:14:48 |
|   2 |   SORT GROUP BY NOSORT|                        |   364 |  2912 |   373K  (1)| 01:14:48 |
|   3 |    INDEX FULL SCAN    | IDX_NVL_MA_TABLE_ASC   |  2193K|       |  6773   (2)| 00:01:22 |
------------------------------------------------------------------------------------------------
De plus, mon indexe de fonction est déja trié.
Vu que je ne souhaite obtenir que les informations d'un colonne et que cette dernière est indexée, pourquoi Oracle ne l'utilise pas et pourquoi ce plan qui prend 1h12' de plus ?

Ps : taille de la table 472 Mo et 60 416 blocks
taille de l'indexe 56 Mo et 7 168 blocks

Merci d'avance pour votre aide.