|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Nouveau Membre du Club
![]() Inscription : avril 2005 Messages : 175 ![]() |
Bonjour,
J'utilise une base de données locale, pour tester (version 5.1.30) et une base sur le serveur, en production (version 5.0.41). J'ai écrit une requête qui fonctionne très bien en local mais qui "mouline" sur le serveur et je n'arrive pas à comprendre pourquoi. J'ai déjà vérifié et les indexs sont identiques. En pièces jointes les résultats des EXPLAIN. En outre, je ne comprends pas pourquoi, dans le EXPLAIN du serveur, pour les 4 premières lignes, la clé utilisée ("key") n'est pas celle indiquée dans la liste des clés possibles ("possible_keys"). Est-ce lié à la différence de version de MySql ? Merci par avance pour votre aide. |
|
|
00
|
|
|
#2 |
![]() ![]() |
Bizarre, on dirait deux explain de deux requêtes différentes !
Est-ce le cas ? Sinon on peut voir la requête ? Et le volume de données est-il sensiblement différent entre le local et le serveur ? Si oui, sur quelles tables ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
00
|
|
|
#3 | ||
|
Nouveau Membre du Club
![]() Inscription : avril 2005 Messages : 175 ![]() |
Voici la requête :
Code :
Les données en local et sur le serveur sont sensiblement les mêmes. Merci ! |
||
|
|
00
|
|
|
#4 | ||||||
![]() ![]() |
J'ai l'impression qu'il y a un gros mélange dans les jointures !
J'ai réussi à reconstituer l'enchaînement de jointures suivant : Code :
Code :
Idem pour contract edition qui est déjà jointe à contract et contracteditionbokk qui est déjà jointe à book qui est déjà jointe à plusieurs tables. Le cheminement des jointures entre les tables doit refléter le schéma de la BDD. Soit tu as une boucle dans tes associations entre tables, soit tu as des jointures inutiles. C'est peut-être ce mélange qui fait analyser la requête de manière différente entre le serveur et le local. Voici ta requête récrite (sans les conditions supplémentaires mentionnées ci-dessus) : Code :
Le signe "différent de" est en SQL <> et non pas !=. Aère et indente le code, c'est plus facile à lire. Utilise des alias, ça réduit l'écriture de la requête et peut aussi améliorer sa lecture. Espérant t'avoir mis sur une piste pour résoudre ton problème.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||||||
|
00
|
|
|
#5 |
|
Nouveau Membre du Club
![]() Inscription : avril 2005 Messages : 175 ![]() |
D'abord merci d'avoir pris le temps de me répondre ainsi !
Concernant la requête (là encore, d'abord merci pour les différents conseils), j'ai fait des jointure "imbriquées" justement parce que sinon je ne parvenais pas au bon résultat (et ainsi, cela fonctionne, tout du moins en local). Pour clarifier le problème, les tables réellement concernées par le problème sont effectivement (et par ordre chronologique d'enregistrement dans la base) : book : fiche livre (bookid) bookcontributor : n contributeurs d'un livre avec fonction (ex. auteur, illustrateur, ...) (bookid, contributorid, functionid) contract : contrat (contractid, contributorid, functionid) contractedition : n éditions sur un contrat (courante, poche, ...) (editionid, contractid) contracteditionbook : n projets sur une édition (projet principal + éventuellement des "nouvelles éditions") (editionid, bookid) Contrainte : les champs contributorid et functionid de la table contract doivent correspondrent aux champs contributorid et functionid de la table bookcontributor (en passant par contractedition et contracteditionbook). Le principe de la requête : récupérer tous les projets sans contrat (donc sans édition) Je ne sais pas si tout ça éclaire un petit peu le problème. De mon côté, j'ai pris le parti faire le traitement par programmation (java) (en récupérant tous les projets, tous les contrats et en vérifiant les projets qu'on ne retrouve pas dans les contrats). Je règle ainsi mon problème de performance mais c'était pour moi un petit enjeu de pouvoir le faire uniquement par requête... |
|
|
00
|
|
|
#6 | ||||||
![]() ![]() |
Citation:
book -1,n----bookcontributor----0,n- contributor function -0,n----------| bookcontributor serait une table associative issue d'une association ternaire du MCD. Citation:
Il semble que cette table soit issue d'une entité du MCD puisqu'elle a son identifiant propre et que cette entité ait 2 associations selon ce schéma : contributor -0,n----avoir----1,1- contract -1,1----concerner----0,n- fonction Ce qui m'étonne un peu ici, c'est que le contrat ne soit pas lié à un livre mais peut-être est-ce normal. Citation:
contract -1,n----contractedition----0,n- edition Ceci dit, je n'ai pas vu la table edition dans la requête mais peut-être n'y en a t-il pas besoin. Citation:
Citation:
Tu n'aurais pas le schéma de la BDD ? Citation:
Je t'encourage fortement à insister sur la résolution du problème en SQL. Sans schéma de la BDD, je vais avoir du mal à t'aider davantage.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||||||
|
00
|
|
|
#7 |
|
Nouveau Membre du Club
![]() Inscription : avril 2005 Messages : 175 ![]() |
Encore merci pour ta réponse.
J'aimerais bien effectivement résoudre ce problème... En pièce jointe un schéma des tables utilisées pour la requête, en espérant qu'il sera assez clair et que ça pourra aider... |
|
|
00
|
|
|
#8 | |
![]() ![]() |
Quand tu dis ceci :
Citation:
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
|
00
|
|
|
#9 | |
|
Nouveau Membre du Club
![]() Inscription : avril 2005 Messages : 175 ![]() |
Citation:
|
|
|
|
00
|
|
|
#10 | ||
![]() ![]() |
Une réponse simple : comme dans la clé primaire de bookcontributor il y a à la fois bookid d'une part, contributorid et functionid qui proviennent de contract d'autre part, ne suffit-il pas de faire cette requête ?
Code :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||
|
00
|
|
|
#11 |
|
Nouveau Membre du Club
![]() Inscription : avril 2005 Messages : 175 ![]() |
Non, parce que justement, il n'existe pas nécessairement de contrat pour un livre.
La requête proposée ne retournerait que les contributeurs non affectés à un livre, ce qui fonctionnellement ne peut pas arriver. Voici les processus :
|
|
|
00
|
|
|
#12 | ||||||||
![]() ![]() |
Ton schéma de données n'est de toute évidence pas complet ; tu as une table function et une table contributor.
Citation:
book -1,n----bookcontributor----0,n- contributor D'après la clé primaire de la table bookcontributor, dans cette association intervient également function : book -1,n----bookcontributor----0,n- contributor function -0,n----------| Tables : book (book_id...) contributor (contributorid...) function (functionid) bookcontributor (bookid, contributorid, functionid...) Citation:
contributor -0,n----avoir----1,1- contract -1,1----concerner----0,n- function Tables : contributor (contributorid...) function (functionid) contract (contractid, contributorid, function_d...) Jusque là, ce sont les deux MCD que j'ai donnés dans un précédent message. Citation:
contract -0,n----contratedition----0,n- edition Mais la table de ton schéma semble plutôt signifier ceci : contract -0,n----avoir----1,1- contratedition Tables : contract (contractid, contributorid, function_d...) contractedition (editionid, contractid...) Citation:
1) Citation:
Tables : book (bookid...) contractedition (editionid, contractid...) bookcontractedition (bookid, editionid...) 2) Citation:
Dans un bon MCD, il faut transformer l'association bookcontributor en entité, que j'appellerais alors contribution, selon ce schéma : book -1,n----concerner----(1,1)- contribution -(1,1)----contribuer----0,n- contributor function -0,n---appliquer----------(1,1)-| Du fait de l'identification relative, marqué par les cardinalités entre parenthèses, on obtient la même table que bookcontributor avec une clé primaire triple, ce qui permet, comme tu l'as fait dans ton schéma, d'associer cette entité/table aux autres entités/tables. Le principe de l'identification relative aurait dû aussi être employé pour cette association : contract -0,n----avoir----(1,1)- contratedition Et la table résultante pour l'édition récupère contract_id dans sa clé primaire : contractedition (contractid, editionid...) Dès lors, on peut transformer cette association : contractedition -0,n----concerner----0,n- book en celle-ci : contractedition -0,n----concerner----0,n- bookcontributor Tables : contractedition (contractid, editionid...) bookcontributor (bookid, contributorid, functionid...) contracteditionbookcontributor (contractid, editionid, bookid, contributorid, functionid...) Eh oui ! 5 colonnes forment la clé primaire ! Et dans tout ce que je viens de décrire, il n'y a pas d'association entre contract et bookcontributor, ce serait redondant avec contracteditionbookcontributor. Revenons au besoin, que l'on peut maintenant, je pense, traduire par : Quel sont les contributions sans édition de contrat ? Code :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||||||||
|
00
|
|
|
#13 |
|
Nouveau Membre du Club
![]() Inscription : avril 2005 Messages : 175 ![]() |
Merci encore pour ton implication !
Tu me conseilles donc de "fusionner" les tables "contracteditionbook" (editionid, bookid) et "contractedition" (contractid,editionid) pour former "contracteditionbookcontributor" (et en y ajoutant les clés contributorid et functionid), au moment où l'on renseigne un livre (book) sur une édition c'est bien ça ? Ou bien est-ce une table supplémentaire ? Si je comprends toujours bien, mieux vaut donc répéter dans une table des informations (ici contributorid et fonctionid) pour faciliter les requêtes plutôt qu'avoir des jointures impossibles à réaliser ? Si tel est bien le cas (ça me semble effectivement très sensé et très réalisable), je vais regarder comment le mettre en oeuvre. Encore mille merci ! |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com