Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/07/2005, 17h00   #1
Nouveau Membre du Club
 
Inscription : avril 2004
Messages : 3
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 3
Points : 26
Points : 26
Par défaut [Firebird 1.5] Problème avec les jointures et les index...

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 :
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 :
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
Cyber Sinh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2005, 10h26   #2
Futur Membre du Club
 
Inscription : novembre 2003
Messages : 40
Détails du profil
Informations forums :
Inscription : novembre 2003
Messages : 40
Points : 18
Points : 18
Bonjour,

Juste une idée...pas une certitude

Visiblement la table t_track n'a pas d'index sur le champ t_track.c_id
.Dans la premiere requete, le seul utilisé pour la jointure; alors que dans la seconde, tu utilises t_track.c_name dans le where.

Quel sont tes index sur cette table ? Si c_id n'en fait pas parti, rajoute un index.

Océane
oceane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2005, 12h05   #3
Nouveau Membre du Club
 
Inscription : avril 2004
Messages : 3
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 3
Points : 26
Points : 26
Bonjour,

La table t_track a bien un index sur le champ c_id puisque c'est la clef primaire...

Je pense que la baisse de performance est simplement du à la différence de la requete. Dans la première, j'utilise une clause WHERE supplémentaire qui permet au moteur de disqualifier d'office un grand nombre d'enregistrements ! Dans la seconde requete, le moteur est obligé de parcourir tous les enregistrements de la table (plus de 3 000 000)...

Le problème, c'est que je ne sais pas comment mieux optimiser ma requête (tous les champs de tri / filtrage contiennent des index). Une idée ?
Cyber Sinh est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h30.


 
 
 
 
Partenaires

Hébergement Web