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

DB2 Discussion :

[requete] optimisation de jointure / proposition de requete.


Sujet :

DB2

  1. #1
    Fabouney
    Invité(e)
    Par défaut [requete] optimisation de jointure / proposition de requete.
    Bonjour à tous, je doit effectuer un traitement sur des tables assez grosse !

    le but étant de sélectionner au harsard 5 ouvrages dans une table en contenant 900 000.

    - la table www_general nous sert uniquement a recupérer la valeur gen_chapid_impress.
    - la table cat contient les id des categorie contenant plusieur ouvrage.
    - la table www_books contient les 900 000 ouvrages.
    - la table abs contient les résumé de chaque ouvrage, 2800 ouvrage ont un résumé


    j'ai procédé de lasorte (sans vouloir inclure la table avec les résumé avant tout) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select a.art_id 
    from www_general,www_cat as a,www_books as b 
    where cont_cat_top_id=gen_chapid_impress 
    and b.art_id = a.art_id and vignette = 'O' 
    and (public_flag = 'P' or public_flag = 'G' or public_flag = 'C') 
    order by rand() 
    fetch first 5 rows only
    bon persos cette requete la bouffe pas enormement car comme vous pouvez le voir elle est tt de meme filtrée, elle doit durer 0.3s a tt cassée.
    mais si on peut l'améliorer faite moi signe.

    le problème se passe apres, pour chaque ouvrage sélectionné, je doit récupérer le resumé de l'ouvrage, le pb c'est que j'aimerai tt aire en 1 requete, mais des que je fait une jointure avec les 3 table dans la premiere requete le temp d'exécution devient énorme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    select a.art_id, abs 
    from www_general,www_cat as a,www_books as b, www_abs as abs 
    where cont_cat_top_id=gen_chapid_impress
    and a.art_id = abs.art_id
    and valid = \'V\'
    and (abs_librairie = '' or abs_librairie='libsav' or abs_librairie='biblioteca')  
    and b.art_id = a.art_id and vignette = 'O' 
    and (public_flag = 'P' or public_flag = 'G' or public_flag = 'C') 
    order by[/b] rand() 
    fetch first 5 rows only
    mais voila, le temp augmente considerablement, normal en meme temp, il doit y avoir a peu pret 28000 enregistrement, a cause de la table www_abs ...

    je ne vois pas comment optimiser.

    pour etre un peu plus clair, j'aimerai donc, recupérer 5 ouvrages avec leur résumé (s'il en non ou pas) dont leur cont_cat_top_id = gen_chapid_impress

  2. #2
    jab
    jab est déconnecté
    Rédacteur
    Avatar de jab
    Homme Profil pro
    SharePoint developpeur
    Inscrit en
    Février 2004
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : SharePoint developpeur
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 1 173
    Points : 4 339
    Points
    4 339
    Par défaut
    Une fois que tu te seras mis en règle avec le forum

    Déjà pour la première, c'est bien une requête ene lecture ? Alors ajoute With UR à la fin. Tu peux également remplacer les 3 or en utilisant la clause IN. C'est plus rapide mais normalement l'optimizer le fait pour toi. Mais c'est du détail.

    Il faudra voir avec explain. Mais je pense que le problème viens de la jointure qui devrait être postposée.

    Essaye de faire la jointure sur les résumés après la sélection.

    Quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    select x.art_id, abs from (select a.art_id 
    from www_general,www_cat as a,www_books as b 
    where cont_cat_top_id=gen_chapid_impress 
    and b.art_id = a.art_id and vignette = 'O' 
    and (public_flag = 'P' or public_flag = 'G' or public_flag = 'C') 
    order by rand() 
    fetch first 5 rows only) as x, www_abs as abs 
    where x.art_id = abs.art_id 
    and (abs_librairie = '' or abs_librairie='libsav' or abs_librairie='biblioteca')
    Tiens nous au courant.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 25
    Points : 30
    Points
    30
    Par défaut
    Une fois que tu te seras mis en règle avec le forum

    Tant qu'on est dans l'optimisation...
    Y a-t-il une différence de performance entre ces 2 requêtes ? Si oui, laquelle est la plus rapide ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select t1.c2, t2.c2
     from t1, t2
     where t1.c1 = t2.c1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select t1.c2, t2.c2
     from t1
      join t2
       on t2.c1 = t1.c1
    Merci.

  4. #4
    jab
    jab est déconnecté
    Rédacteur
    Avatar de jab
    Homme Profil pro
    SharePoint developpeur
    Inscrit en
    Février 2004
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : SharePoint developpeur
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 1 173
    Points : 4 339
    Points
    4 339
    Par défaut
    Une fois que tu te seras mis en règle avec le forum

    Nn aucune différence. Il s'agiit uniquement d'une différence de syntaxe, une évolution de la norme SQL. La seconde étant plus ancienne à plus de chance d'être portable vers d'autres serveurs DB même ancien.

  5. #5
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Bonjour Fabouney

    Veuillez svp vous mettre en règle avec le forum en éditant votre post afin de modifier votre titre en conséquence. (Bouton en haut à droite du premier post de ce thread)

    Les règles du forum

  6. #6
    Fabouney
    Invité(e)
    Par défaut
    Merci pour la proposition de larequête jab, je testerai lundi au boulot.
    je vous tient au courant du résultat.

    a bientot

  7. #7
    jab
    jab est déconnecté
    Rédacteur
    Avatar de jab
    Homme Profil pro
    SharePoint developpeur
    Inscrit en
    Février 2004
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : SharePoint developpeur
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 1 173
    Points : 4 339
    Points
    4 339
    Par défaut
    Une question me vient à l'esprit. As-tu bien un index sur la colonne réalisant le jointure ?

  8. #8
    Fabouney
    Invité(e)
    Par défaut
    Euh oui, j'en ai mit un sur art_id de la table www_abs (table des résumé).

    quand j'exécute ta requête j'obtient ceci :

    SQL0104N An unexpected token "END-OF-STATEMENT" was found following "ww_cat as a,
    www_books as b". Expected tokens may include: ")". SQLSTATE=42601
    je vois pas trop ce que c'est, il manque pourtant pas de ")" apparement.

  9. #9
    Fabouney
    Invité(e)
    Par défaut
    C'est bon j'ai reussi à effectuer la requête.

    Donc ca ne va vraiment pas lol, c'est bien ce que je redouter, le fait de faire une jointure avec www_abs et www_books, nous donne que les ouvrages ayant un résumé, de plus, j'ai tjr les doublons.

    c'est a dire les bouqin ayant le meme art_id, n'etant pas dans la meme librairie, donc n'ayant pas le meme résumé, et pourtant il serait nécessaire d'en prendre un seul.

    pas évident tt ceci je vous le fait pas dire, mais il s'avere que le MCD la structure de la base est a revoir, mais la ... je n'est pas le droit de modifier cette structure.

  10. #10
    Fabouney
    Invité(e)
    Par défaut
    donc je crois que je vais rester avec cette idée : c'est à dire dans un premier temp sélectionner que tout les livres de la catégorie souhaitée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select a.art_id
     from www_general,www_cat as a,www_books as b 
    where cont_cat_top_id=gen_chapid_impress 
    and b.art_id = a.art_id 
    and vignette = 'O' 
    and (public_flag = 'P' or public_flag = 'G' or public_flag = 'C') order by rand() fetch first 5 rows only
    et dans un second temp, pour chaque ouvrage regarder s'il existe un résumé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select abs
     from www_abs 
    where valid='V' 
    and art_id='art_id' 
    and (abs_librairie = '$(lib_id)' or abs_librairie = '' or abs_librairie='libsav' or abs_librairie='biblioteca')
    je pense que c'est la meilleure solution en vue de la structure des tables... avec des index sur art_id des tables utilisées, le temps de traitement est nettement diminué ...
    mais bon.

    merci qd meme d'avoir essayé d'apporter des solutions ...

Discussions similaires

  1. Optimisation requete SQL ,plusieurs jointure ?
    Par mamiberkof dans le forum Langage SQL
    Réponses: 1
    Dernier message: 22/02/2008, 16h39
  2. Réponses: 8
    Dernier message: 21/07/2006, 10h12
  3. Réponses: 4
    Dernier message: 29/06/2006, 10h11
  4. Réponses: 15
    Dernier message: 14/04/2006, 15h34
  5. jointure entre deux requete
    Par Youssef dans le forum Langage SQL
    Réponses: 21
    Dernier message: 15/01/2004, 15h13

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