IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Firebird Discussion :

[Firebird 1.5] Problème avec les jointures et les index...


Sujet :

SQL Firebird

  1. #1
    Membre habitué

    Inscrit en
    Avril 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 3
    Points : 145
    Points
    145
    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 : 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

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 40
    Points : 35
    Points
    35
    Par défaut
    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

  3. #3
    Membre habitué

    Inscrit en
    Avril 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 3
    Points : 145
    Points
    145
    Par défaut
    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 ?

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/08/2006, 16h46
  2. [Tableaux] Problème avec un array et les pseudo frame
    Par azerty53 dans le forum Langage
    Réponses: 6
    Dernier message: 10/05/2006, 14h57
  3. Problème avec l'unicode et les exceptions
    Par Rafy dans le forum C++
    Réponses: 5
    Dernier message: 07/02/2006, 00h52
  4. problème avec strtok pour récupérer les vides
    Par manikou dans le forum MFC
    Réponses: 4
    Dernier message: 02/06/2005, 20h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo