|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre du Club
![]() Étudiant Inscription : décembre 2008 Messages : 126 ![]() |
Bonjour,
J'ai une grosse requete impliquant une dizaine de table ( la 1ere possedant 3 cles etrangere, et la requete veut recuperer des champs de ces 3 tables) et des trucs dans le genre. Actuellement, je me pose la question de rapidite de traitement. Existe-t-il un moyen plus rapide que 10 requetes imbriques ? Comme par exemple l'utilisation de fonction pour chaque table ? Merci d'avance Julien EDIT : Voici la query Code :
|
||
|
|
00
|
|
|
#2 |
![]() ![]() |
Ne peux-tu faire cette requête uniquement avec des jointures plutôt qu'avec des sous-requêtes ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. 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 la suite Linux Mageïa ! |
|
00
|
|
|
#3 |
|
Membre du Club
![]() Étudiant Inscription : décembre 2008 Messages : 126 ![]() |
Je vais essayer mais, ayant deja essaye, je n'arrivais jamais au bon resultat
Mais bon merci qd meme |
|
|
00
|
|
|
#4 | ||||
![]() ![]() |
Ca devrait donner à peu près ça :
Code :
Remarque 2 : Dans la requête, il peut y avoir un problème au niveau de l'avant dernière jointure car la condition porte sur 2 tables. Il faudrait normalement deux instances de la table WorkShop.PLTWKORD AS A, ce qui pourrait donner ça : Code :
A essayer.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. 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 la suite Linux Mageïa ! |
||||
|
00
|
|
|
#5 | ||
![]() ![]() |
Déjà est-ce que toutes les jointures externes se justifient ?
Par exemple, si vous avez des clefs étrangères vers des tables de références vous savez que vous n'en avez pas besoin (rapidement, je perçois les sites, les catégories, les job types), et les jointures externes sont plus coûteuses. Ensuite, c'est recommandé d'écrire "tout d'un coup". L'optimiseur de toute façon réécrira la requête comme il lui plaît, alors autant simplifier le code : Code :
Edit 2 : Phil, je pense qu'aucune de vos deux remarques soit juste. Le moteur SQL doit convertir between en >= et <=. Le double prédicat de jointure sur une même table ne pose pas de problème si le besoin le justifie.
__________________
Email : http://scr.im/waldar |
||
|
00
|
|
|
#6 | |
![]() ![]() |
Pas sûr ! Si BETWEEN existe, il doit y avoir une raison. Et si j'en crois SQLPro (Point 7 du tableau), BETWEEN serait plus optimisé que >= AND <=.
Citation:
Logiquement, la syntaxe de la jointure signifie qu'on joint 1 table à 1 autre. La condition de jointure ne devrait donc porter que sur ces deux tables et pas une troisième. Peut-être cette double condition arrive t-elle parce que plusieurs cheminements sont possibles dans le modèle de données pour arriver à la dernière table ? Encore une fois, je suis très méfiant et une vérification du résultat s'impose.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. 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 la suite Linux Mageïa ! |
|
|
00
|
|
|
#7 | ||||||
![]() ![]() |
J'ai testé à l'instant sur Oracle (9i / 11g) et SQL Server (2005), aucune différence de plan d'exécution entre BETWEEN et >= / <=.
Pour les multi jointures, faisons un test (syntaxe SQL Server). On a trois tables qu'on rempli : Code :
Code :
Code :
__________________
Email : http://scr.im/waldar |
||||||
|
00
|
|
|
#8 |
|
Membre du Club
![]() Étudiant Inscription : décembre 2008 Messages : 126 ![]() |
Bonjour et merci encore de vous pencher sur le probleme.
J'ai en effet enlever les requetes imbriques et j'ai modifie le between. Par contre pour la jointure avec 2 conditions c'est necessaire car ce sont les 2 cles primaires de la table. Je sui sentrain de regarder au niveau des index dans sql server 2005 et voila je ne sais comment faire pour faire mieux. Pour les joitures externes effectivment, il ne me faut pas garder les cles etrangere mais juste m'en servir pour acceder certaines donnees. Il y a t il d'autre moyen pour faire cela? Merci |
|
|
00
|
|
|
#9 | |
![]() ![]() |
Citation:
Le principe de la jointure externe c'est de ramener les résultats si une partie de la jointure n'existe pas. Je suis quasi sûr que votre table WorkShop.PLTJOBCAT qui contient les libellés des catégories possède une clef primaire sur JC_CATEGORYCODE, et j'espère que votre table WorkShop.PLTJOBCD a une clef étrangère indexée sur sa colonne JC_CATEGORYCODE. Si c'est le cas, la jointure externe est complètement inutile et vous pouvez convertir votre LEFT OUTER JOIN en INNER JOIN. Si vous éliminez la majorité des jointures externes vous gagnerez en performance.
__________________
Email : http://scr.im/waldar |
|
|
00
|
|
|
#10 | |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 12 101 ![]() |
Citation:
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
|
00
|
|
|
#11 | ||
![]() ![]() |
Si tu pouvais fournir un schéma (MCD, MLD, E/R, diagramme de classes...) de ta BDD, on pourrait peut-être trouver une autre manière de t'aider à joindre tout ça correctement.
Une description du besoin ne serait pas de trop non plus. Tu as vraiment besoin de ramener toutes ces colonnes ? Citation:
Le principe de base est que les tables sont associées par une condition de jointure entre clé primaire et clé étrangère. Citation:
Quand j'ai à faire des requêtes complexes, je pars du schéma de la BDD pour construire le cheminement des jointures. Essaie de faire pareil.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. 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 la suite Linux Mageïa ! |
||
|
00
|
|
|
#12 |
|
Membre du Club
![]() Étudiant Inscription : décembre 2008 Messages : 126 ![]() |
Je viens d'en referer a mon DBA, on va refaire la db car on est en plein rewrite donc ce sera mieux de repartir sur de bonne base.
Je creuse la dessus et je veins vous retrouver quand tout sera propre si j'ai encore des soucis. Encore merci ^^ |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com