Bonjour,

Pourquoi la première requête n'utilise pas les index sur la table T_TRACK (et s'exécute en 15 s !) alors que la seconde les utilise correctement (et s'exécute en 0 s!) ?

PS: J'utilise Firebird 1.5

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
SELECT t_album.c_id, t_album.c_artist, t_album.c_name
FROM t_album
INNER JOIN t_albumjoin ON t_albumjoin.c_album = t_album.c_id
INNER JOIN t_track ON t_albumjoin.c_track = t_track.c_id
INNER JOIN t_artist ON t_artist.c_id = t_track.c_artist
WHERE t_artist.c_name = 'Evanescence';

Plan
PLAN JOIN (T_TRACK NATURAL,T_ARTIST INDEX (ARTIST_PKEY),T_ALBUMJOIN INDEX (ALBUMJOIN_FK_TRACK),T_ALBUM INDEX (ALBUM_PKEY))

Plan Adpaté
PLAN JOIN (T_TRACK NATURAL,T_ARTIST INDEX (ARTIST_PKEY),T_ALBUMJOIN INDEX (ALBUMJOIN_FK_TRACK),T_ALBUM INDEX (ALBUM_PKEY))

------ Performance info ------
Prepare time = 0ms
Execute time = 15s 828ms
Avg fetch time = 565,29 ms
Current memory = 1 110 768
Max memory = 1 244 108
Memory buffers = 2 048
Reads from disk to cache = 3 680
Writes from cache to disk = 0
Fetches from cache = 5 112 579



Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
SELECT t_album.c_id, t_album.c_artist, t_album.c_name
FROM t_album
INNER JOIN t_albumjoin ON t_albumjoin.c_album = t_album.c_id
INNER JOIN t_track ON t_albumjoin.c_track = t_track.c_id
INNER JOIN t_artist ON t_artist.c_id = t_track.c_artist
WHERE t_artist.c_name = 'Evanescence' AND
t_track.c_name = 'Anywhere' AND
t_album.c_name = 'Origin';

Plan
PLAN JOIN (T_TRACK INDEX (TRACK_NAME),T_ARTIST INDEX (ARTIST_PKEY),T_ALBUM INDEX (ALBUM_NAME),T_ALBUMJOIN INDEX (ALBUMJOIN_FK_TRACK,ALBUMJOIN_FK_ALBUM))

Plan Adpaté
PLAN JOIN (T_TRACK INDEX (TRACK_NAME),T_ARTIST INDEX (ARTIST_PKEY),T_ALBUM INDEX (ALBUM_NAME),T_ALBUMJOIN INDEX (ALBUMJOIN_FK_TRACK,ALBUMJOIN_FK_ALBUM))

------ Performance info ------
Prepare time = 0ms
Execute time = 0ms
Avg fetch time = 0,00 ms
Current memory = 1 128 940
Max memory = 1 244 108
Memory buffers = 2 048
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 783


Merci pour votre aide.
Cyber Sinh