Bonjour,

J'aimerai vous soumettre une question concernant l'utilisation d'index.
Voici la table concernée :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
CREATE TABLE REA_NOTIF_EXPORT_BANDE  (
   PK_NOTIF_EXPORT_BANDE NUMBER,
   BANDE VARCHAR2(32),
   DATEHEURE DATE,
   STATUT VARCHAR2(32)
);
Voici un index créé sur cette table :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
CREATE INDEX IDX_EXPBD_HEUREBANDE_FCT ON REA_NOTIF_EXPORT_BANDE
(EXTRAIRE_SAVEDAY(DATEHEURE), BANDE)
;
La fonction extraire_saveday fait un trunc au jour près de la date entrée en paramètre, et la table contient environ 14000 enregistrements.

Si j'execute cette requete, l'index est bien utilisé :
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
23
24
25
26
27
 
SQL> select exp.bande, exp.dateheure, exp.statut from
  2  ( 
  3  select 'PC0147L3' as BANDE, to_date('24/03/2009','dd/mm/yyyy') as SAVEDAY FROM DUAL 
  4  ) bd
  5  JOIN rea_notif_export_bande exp
  6   ON extraire_saveday(exp.dateheure) = bd.saveday
  7   AND exp.bande = bd.bande;
 
BANDE                            DATEHEUR STATUT
-------------------------------- -------- --------------------------------
PC0147L3                         25/03/09 1
 
 
Plan d''exécution
----------------------------------------------------------
Plan hash value: 1259708469
 
----------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name                     | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                          |     1 |    20 |     5   (0)| 00:00:01 |
|   1 |  NESTED LOOPS                |                          |     1 |    20 |     5   (0)| 00:00:01 |
|   2 |   FAST DUAL                  |                          |     1 |       |     2   (0)| 00:00:01 |
|   3 |   TABLE ACCESS BY INDEX ROWID| REA_NOTIF_EXPORT_BANDE   |     1 |    20 |     3   (0)| 00:00:0
|*  4 |    INDEX RANGE SCAN          | IDX_EXPBD_HEUREBANDE_FCT |     2 |       |     1   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------
Maintenant, si je remplace le "select ... from dual" par une autre requete ne me renvoyant qu'une ligne exactement identique, l'index ne sera plus utilisé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
SQL> select distinct bande, saveday from rea_service serv
  2     JOIN rea_notif_ntw_savegroup clo
  3        ON clo.fk_service = serv.pk_service
  4       JOIN rea_notif_ntw_saveset ss
  5           ON clo.pk_notif_ntw_savegroup = ss.fk_notif_ntw_savegroup
  6         JOIN rea_notif_ntw_bande bd
  7           ON ss.pk_notif_ntw_saveset = bd.fk_notif_ntw_saveset
  8  WHERE pk_service = 68062;
 
BANDE                            SAVEDAY
-------------------------------- --------
PC0147L3                         24/03/09
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
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 
SQL> select exp.bande, exp.dateheure, exp.statut from
  2  (
  3  select distinct bande, saveday from rea_service serv
  4     JOIN rea_notif_ntw_savegroup clo
  5        ON clo.fk_service = serv.pk_service
  6       JOIN rea_notif_ntw_saveset ss
  7           ON clo.pk_notif_ntw_savegroup = ss.fk_notif_ntw_savegroup
  8         JOIN rea_notif_ntw_bande bd
  9           ON ss.pk_notif_ntw_saveset = bd.fk_notif_ntw_saveset
 10  WHERE pk_service = 68062
 11  ) bd
 12  JOIN rea_notif_export_bande exp
 13          ON extraire_saveday(exp.dateheure) = bd.saveday
 14          AND exp.bande = bd.bande;
 
 
BANDE                            DATEHEUR STATUT
-------------------------------- -------- --------------------------------
PC0147L3                         25/03/09 1            
 
 
Plan d''exécution
----------------------------------------------------------
Plan hash value: 1172785269
 
----------------------------------------------------------------------------------------------------
| Id  | Operation                          | Name                         | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                   |                              |     2 |   350 |   220   (2)| 00:00:03 |
|   1 |  VIEW                              |                              |     2 |   350 |   220   (2)| 00:00:03 |
|   2 |   HASH UNIQUE                      |                              |     2 |   214 |   220   (2)| 00:00:03 |
|*  3 |    HASH JOIN                       |                              |     2 |   214 |   219   (1)| 00:00:03 |
|*  4 |     TABLE ACCESS BY INDEX ROWID    | REA_NOTIF_NTW_BANDE          |     1 |    15 |     3   (0)| 00:00:01 |
|   5 |      NESTED LOOPS                  |                              |    38 |  2204 |   162   (0)| 00:00:02 |
|   6 |       NESTED LOOPS                 |                              |    41 |  1763 |    39   (0)| 00:00:01 |
|   7 |        NESTED LOOPS                |                              |     2 |    66 |     5   (0)| 00:00:01 |
|   8 |         TABLE ACCESS BY INDEX ROWID| REA_SERVICE                  |     1 |    18 |     2   (0)| 00:00:01 |
|*  9 |          INDEX UNIQUE SCAN         | IDX_REA_SERVICE_PK           |     1 |       |     1   (0)| 00:00:01 |
|  10 |         TABLE ACCESS BY INDEX ROWID| REA_NOTIF_NTW_SAVEGROUP      |     2 |    30 |     3   (0)| 00:00:01 |
|* 11 |          INDEX RANGE SCAN          | IDX_REA_SAVEGROUP_FK_SERVICE |     2 |       |     1   (0)| 00:00:01 |
|  12 |        TABLE ACCESS BY INDEX ROWID | REA_NOTIF_NTW_SAVESET        |    25 |   250 |    21   (0)| 
|* 13 |         INDEX RANGE SCAN           | IDX_REA_SAVESET_FK_SAVEGROUP |    25 |       |     2   (0)| 00:00:01 |
|* 14 |       INDEX RANGE SCAN             | IDX_REA_BANDE_FK_SAVESET     |     1 |       |     2   (0)| 00:00:01 |
|  15 |     TABLE ACCESS FULL              | REA_NOTIF_EXPORT_BANDE       | 14126 |   675K|    56   (2)| 00:00:01
----------------------------------------------------------------------------------------------------
Il fait maintenant un ACCESS FULL sur la table REA_NOTIF_EXPORT_BANDE, pourtant la jointure est à première vue identique.
Quelqu'un saurait-il m'expliquer ce phénomène?
Merci d'avance.

EDIT : petit oubli, il s'agit d'Oracle 10g.