désolé pour le délai, j’était resté sur ma prog Excel (j’essaie de me faire plaindre…)
Tu démarre les jointures sur des requêtes de haut vol! :ouch:
Bon, il faudrait juste 2-3 infos pour voir ce qui manque.
d’abord sur ton schéma
http://www.ibpc.fr/Perso/Nicolas.Guiot/img/DB_Complex_V4.png
qui je le répète est très utile pour voir ce qu’on veut faire, il manque les tables: MM_PBSA_GB, MM_PBSA_GAS
… pour qu’on puisse comprendre ton besoin.
Ensuite, je m’appuis sur ta 1ère Requête, il faudrait faire quelques tests de jointure, pour voir exactement ton contenu de base, et ajouter les jointures progressivement pour voir ce qui ne marche pas. Parcque je dois dire, un jointure sur 8 tables, j’en ai jamais fait, et j’espère bien ne jamais avoir besoin.
J’avais dit qu’une jointure complexe pouvait prendre du temps, alors je fais remonter quelques souveneir de cours de SGBD que je ne pense pas trop erronés:
sur tes tables ParamGB, paramPhGas tu utilise des clefs etrangères, (normal, ce sont des tables d’association) et donc chaque jointure peut retourner plus d’un élément. c’est à dire, par exemple, si une molécule a plus d’une trajectoire, (via cette table d’association), la jointure va retourner toutes les trajectoires de cette molécule, et inversement, si pour une trajectoire on a plusieurs molecule, la jointure retourne toutes les molécules de cette trajectoire. Cette exemple s’applique à toutes tes relations n-n (impliqué par les tables d’association)
…
je suis toujours clair?
…
C’est pas finit: parcque là ou je veux en venir, c’est que même s’il n’y a que 1000 lignes comme tu le disais, tu peux avoir potentiellement un résultat de 1000 molecules * 1000 trajectoire = 1 000 000 de lignes de résulat, et je ne prend en compte qu’une jointure, comme il y en a 8, on peut imaginer au pire 1000 ^8 = 10^24 lignes de résultat.
ce n’est que le pire des cas, et tu dois être bien en dessous, c’est juste pour illustrer comment des jointure un peu pointues peuvent faire ramer ton serveur.
…
Tu me dira, oui mais dans le where, je ne sélectionne pas tout, oui, mais suivant l’optimisation du serveur, il peut faire les jointures en priorité, et ensuite sélectionner tes résultats parmis les 10^24 résultats de la jointure. Ce dont je ne suis pas sûr à 100% mais que pichat, mon prof de BDD pourrait peut-être me dire.
Tout ce laius pour introduire l’intérêt de ces quelques tests, et d’une solution éventuelle, mais qui dépend grandement du langage utilisé( dis le nous).
Test 1 jointure impliquée par ParamGB
SELECT count *
FROM ParamGB, Molecule, Trajectory, prmtop , igb
WHERE MM_PBSA_GB.Frame = MM_PBSA_GAS.Frame
AND ParamGB.idMolecule = Molecule.idMolecule
AND ParamGB.idTraj = Trajectory.idTraj
AND ParamGB.idPrmtop = prmtop.idPrmtop
AND ParamGB.idIgb = igb.idIgb
ou
SELECT ParamGB.idparamGB
FROM ParamGB, Molecule, Trajectory, prmtop , igb
WHERE MM_PBSA_GB.Frame = MM_PBSA_GAS.Frame
AND ParamGB.idMolecule = Molecule.idMolecule
AND ParamGB.idTraj = Trajectory.idTraj
AND ParamGB.idPrmtop = prmtop.idPrmtop
AND ParamGB.idIgb = igb.idIgb
Test 2 toute la jointure, sans les critères du where
SELECT MM_PBSA_GB.Frame, MM_PBSA_GAS.Frame , MM_PBSA_GB.GB, MM_PBSA_GAS.Ele
FROM ParamGB, Molecule, Trajectory, prmtop , igb, ParamPhGas
WHERE MM_PBSA_GB.Frame = MM_PBSA_GAS.Frame
AND ParamGB.idMolecule = Molecule.idMolecule
AND ParamPhGas.idMolecule = Molecule.idMolecule
AND ParamGB.idTraj = Trajectory.idTraj
AND ParamPhGas.idTraj = Trajectory.idTraj
AND ParamGB.idPrmtop = prmtop.idPrmtop
AND ParamGB.idIgb = igb.idIgb
Test 3 toute la jointure, sans les critères du where
SELECT count (*)
FROM MM_PBSA_GB, MM_PBSA_GAS, ParamGB, Molecule, Trajectory, prmtop , igb, ParamPhGas
WHERE MM_PBSA_GB.Frame = MM_PBSA_GAS.Frame
AND MM_PBSA_GB.idParamGB = ParamGB.idParamGB
AND MM_PBSA_GAS.idParamPhGas = ParamPhGas.idParamPhGas
AND ParamGB.idMolecule = Molecule.idMolecule
AND ParamPhGas.idMolecule = Molecule.idMolecule
AND ParamGB.idTraj = Trajectory.idTraj
AND ParamPhGas.idTraj = Trajectory.idTraj
AND ParamGB.idPrmtop = prmtop.idPrmtop
AND ParamGB.idIgb = igb.idIgb
La taille des ces jointures, (fait plusieurs essai en en enlevant quelque-unes) t’indiqueras un peu la complexité du travaile serveur qu’il y a derrière, et donc le temps de traitement.
Si ça ne passe pas, c’est que ta jointure est trop grosse, ou fausse, est-ce que tu utilise bien les clefs primaires etc.
Peut-être qu’en remontant les jointures portant sur les clef primaires, la réquête sera mieu optimisée.
pour la solution, quand je parlait de séparer en 2 requête, je ne parlait pas de faire une jointure à la main, ou tu regroupe 2 reuqêtes ensembles, non, mais plutôt d’une requête qui te retourne les “ids” correspondant aux résultats ue te cherche, puis une 2ème requête que tu lance pour chaque id, et qui te permet de retrouver tes informations pour affichage. ça fait peut-être pas optimal, mais ça risque d’être plus facile à debugger.
- récup 1à n id:
SELECT ParamGB.idparamGB
FROM ParamGB, Molecule, Trajectory, prmtop , igb
WHERE MM_PBSA_GB.Frame = MM_PBSA_GAS.Frame
AND ParamGB.idMolecule = Molecule.idMolecule
AND ParamGB.idTraj = Trajectory.idTraj
AND ParamGB.idPrmtop = prmtop.idPrmtop
AND ParamGB.idIgb = igb.idIgb
AND Molecule.Name = "whole"
AND Trajectory.Name = "nscm"
AND prmtop.Name = "mbondi"
AND igb.Name = "1"
- pour chaque id récup le reste des informations
SELECT MM_PBSA_GB.Frame, MM_PBSA_GAS.Frame , MM_PBSA_GB.GB, MM_PBSA_GAS.Ele
FROM MM_PBSA_GB, MM_PBSA_GAS
WHERE MM_PBSA_GB.Frame = MM_PBSA_GAS.Frame
AND MM_PBSA_GAS.idParamPhGas = ParamPhGas.idParamPhGas
AND MM_PBSA_GB.idParamGB = 'monIdRecupEn1.'
ORDER BY MM_PBSA_GB.Frame ASC
Pfiou, c’t’écriture, j’espère qu’on aura le courage de me lire. :’(