Bonjour,
J'aimerai vous soumettre une question concernant l'utilisation d'index.
Voici la table concernée :
Voici un index créé sur cette table :
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) );
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.
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) ;
Si j'execute cette requete, l'index est bien utilisé :
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
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 | ----------------------------------------------------------------------------------------------------
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/09Il fait maintenant un ACCESS FULL sur la table REA_NOTIF_EXPORT_BANDE, pourtant la jointure est à première vue identique.
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 ----------------------------------------------------------------------------------------------------
Quelqu'un saurait-il m'expliquer ce phénomène?
Merci d'avance.
EDIT : petit oubli, il s'agit d'Oracle 10g.
Partager