|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||
|
Invité régulier
![]() Inscription : novembre 2005 Messages : 23 ![]() |
Bonjour,
Difficile de décrire dans le titre ma question. Voici le MCD utilisé pour créer ma bdd http://img137.imageshack.us/i/mcdp.png Voici les tables : Code :
La table item contient tous les items des listes, par ex "banane", "violet", "courgette". Les 3 colonnes couleur, fruit et legume de ma table personne sont des clés étrangères liées à la table item. Chaque personne a donc un unique fruit, un unique légume et une unique couleur Pour récupérer dans une requête des informations sur les clients, et récupérer les intitulés, j'ai 2 possibilités: Requête 1 Code :
Code :
* La première utilise 3 appels à la même table "item" (+jointure vers "liste") avec des alias différents et a besoin de 3 clauses WHERE Il est simple d'ajouter des clauses WHERE comme * La 2ème utilise des SELECT imbriqués. Je ne sais pas comment ajouter une clause WHERE , par exemple sur la couleur.. Qu'est ce qui sera le mieux à l'usage, sachant que je veux utiliser les 2 tables item et list pour des colonnes d'autres tables que "personne" ? Merci d'avance |
||||||
|
|
00
|
|
|
#2 | ||
|
Invité régulier
![]() Inscription : novembre 2005 Messages : 23 ![]() |
Pour info, la première requête peut être écrite plus "joliment" ainsi
Code :
|
||
|
|
00
|
|
|
#3 |
|
Invité régulier
![]() Inscription : novembre 2005 Messages : 23 ![]() |
J'ai testé les coûts via un EXPLAIN :
Requête 1 (avec les INNER JOIN et sans WHERE) Code :
Hash JOIN (cost=221.33..261.85 rows=330 width=160) Code :
Seq Scan ON personne p (cost=0.00..16395.48 rows=330 width=76) |
|
|
00
|
|
|
#4 |
![]() ![]() Inscription : octobre 2008 Messages : 1 505 ![]() |
A quoi servent les jointures avec la table liste? Il me semble que si elles n'étaient pas là, le résultat serait le même. Si c'est le cas autant les enlever.
|
|
|
00
|
|
|
#5 | |||||
|
Invité régulier
![]() Inscription : novembre 2005 Messages : 23 ![]() |
Citation:
Maintenant, voici les 2 nouvelles requêtes et les coûts associés: Requête 1 Code :
Code :
"Hash Join (cost=108.30..135.21 rows=330 width=160)"
Code :
Code :
"Seq Scan on personne p (cost=0.00..8198.20 rows=330 width=76)"
|
|||||
|
|
00
|
|
|
#6 |
![]() ![]() |
Je suppose que les colonnes couleur, fruit et legume sont indexées puisque ce sont des clés étrangères ?
Si le cost est exprimé en secondes, 108 secondes avec seulement 330 lignes, il y a un problème quelque part ! La première requête est meilleur sur le plan conceptuel mais je suis étonné de son résultat par rapport à la seconde.
__________________
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 | |||
|
Invité régulier
![]() Inscription : novembre 2005 Messages : 23 ![]() |
Citation:
Citation:
Je recherche dans la doc... http://doc.postgresql.fr/9.0/sql-explain.html nous dit qu'ils sont "mesurés en unités de récupération de pages sur le disque". Il y a en fait le temps de démarrage, et le temps d'exécution totale. Il n'y a pas non plus 330 lignes (seulement 10). Donc dans mon cas, même sans index, le temps d'execution total était donc en fait bien meilleur avec la requête 1 (135) qu'àvec la 2 (8198) Citation:
Requête 1: "Nested Loop (cost=0.00..63.55 rows=3 width=160)" Requête 2: "Seq Scan on personne p (cost=0.00..75.44 rows=3 width=76)" On est donc encore gagnant avec la 1, comme quoi quand c'est mieux au niveau conceptuel, c'est souvent mieux au niveau performances. Merci de m'avoir obligé à réfléchir ! |
|||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com