|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||||||||
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 643 ![]() |
Bonjour,
Table MA_TABLE (A, Bfk, C, D) où Bfk est une colonne que l'on peut jondre la table Tb (FK) Code :
Code :
En fait j'essaie aussi d'optimiser cette requête (longue!) Code :
Code :
|
||||||||
|
|
00
|
|
|
#2 | ||||
![]() ![]() |
Citation:
Une jointure n'existe que lors d'une requête, tandis qu'une colonne est persistante. Peut-être vouliez-vous parler d'une clef étrangère, ou encore d'une colonne commune ? Dans le cas exposé ici, les deux requêtes sont identiques. Mais c'est parce que vous l'avez présenté avec une jointure forte (JOIN simple, équivalent à INNER JOIN). Avec une jointure externe les requêtes sont différentes. Est-ce que vos tables ou vues t2_v1 / t2_v2 et t3_v1 / t3_v2 sont les mêmes ? Dans la clause de jointure avec t3_v2 vous n'y faites pas référence, je pense que c'est une erreur lors de l'écriture de la requête ici. Si ce n'est pas confidentiel, n'hésitez pas a publier l'intégralité de votre requête. Si ça l'est, il suffit de changer le nom des objets. Citation:
Code :
__________________
Email : http://scr.im/waldar |
||||
|
00
|
|
|
#3 | ||
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 643 ![]() |
J'ai corrigé ma question (oui, t2_v1 / t2_v2 et t3_v1 / t3_v2 désignent une même table t2 et t3).
Puisque tu veux la requête complète, la voilà mais c'est imbuvable quand on ne connait pas le modèle à mon avis : Code :
|
||
|
|
00
|
|
|
#4 | ||
![]() ![]() |
Est-ce que la requête ci-dessous est équivalente en terme de résultat ?
J'ai remplacé certaines sous-requêtes par des jointures. Quels sont exactement vos problèmes de performance (volumétries, temps de réponses, explain plan) ? Code :
__________________
Email : http://scr.im/waldar |
||
|
00
|
|
|
#5 | ||||
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Fabien,
Code :
Code :
|
||||
|
|
00
|
|
|
#6 | ||
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 643 ![]() |
Merci pour ta réponse. j'apprendrai au moins dans un premier temps l'existence de "WITH xxx AS".
Sinon en dehors de la faute de frappe du ==, la requête ne fonctionne pas car tu tombes comme moi un moment sur la limitation qui donne envie de s'arracher les cheveux dans la section : Code :
|
||
|
|
00
|
|
|
#7 | |||
![]() ![]() |
Citation:
C'est strictement équivalent à : Code :
Idéalement un petit jeu de données sur les tables impliquées par cette jointure permettra de bien analyser le besoin.
__________________
Email : http://scr.im/waldar |
|||
|
00
|
|
|
#8 | |
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 643 ![]() |
Citation:
Mais la tienne introduit une sous-requête interdite alors que moi je l'ai déportée dans le select (compare la mienne et la tienne au niveau de l'utilisation de la table RefREF) Sinon je veux bien te donner mon explain plan mais a priori je ne pourrai pas faire celui de ta requête commençant par "WITH" car Oracle me répond ORA-32034: unsupported use of WITH clause Sinon nos 2 requêtes durent à peu près la même durée (sans l'histoire de RefREF réintroduite) mais la mienne renvoie 754 lignes (résultat juste fonctionnellement car déjà validé) et la tienne 506 lignes. Mais bon, peut-être qu'on ne peux pas l'améliorer : elle tape dans tellement de (grosses) tables que c'est peut-être difficile de faire mieux (et puis pour toi sans avoir accès à une base similaire, c'est dur de m'aider de façon précise). |
|
|
|
00
|
|
|
#9 |
![]() ![]() |
J'ai oublié une question essentielle en effet, quelle version d'Oracle ?
L'explain plan, c'est toujours bon à prendre, mais j'ai surtout besoin de quelques données représentatives pour réécrire en partie votre requête. J'imagine très bien que vous cherchez des informations relatives à un dernier statut, mais j'ai besoin de bien me le représenter - et de pouvoir tester. Si les deux requêtes ne renvoient pas le même nombre de lignes, c'est que j'ai raté quelque chose, je pensais qu'elles étaient équivalentes.
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#10 | ||
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 643 ![]() |
Citation:
Citation:
|
||
|
|
00
|
|
|
#11 |
![]() ![]() |
En partant d'une seule valeur de RPM.RPMIDT, qui n'a pas trop de lignes dans les autres tables, ça doit pouvoir se trouver à coup de count(*).
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#12 | |||||||||||
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Citation:
Une jointure externe sur une table t est inutile à partir du moment où vous la faite suivre d'une clause du type and t.autre_colonne = 'n'importe quelle valeur'; Code :
Code :
Je passe maintenant aux jointures Oracle Code :
Enfin, ceci Code :
externe) |
|||||||||||
|
|
00
|
|
|
#13 | ||
![]() ![]() |
Mohamed, je suis d'accord avec votre démonstration, mais je ne vois rien de contradictoire entre votre démonstration et mes propos !
Pour refléter la discussion, il aurait fallu que vous testiez avec cette jointure : Code :
__________________
Email : http://scr.im/waldar |
||
|
00
|
|
|
#14 | |||
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Citation:
Oui c'est exact et après vérification vous avez tout à fait raison. Désolé |
|||
|
|
00
|
|
|
#15 |
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 643 ![]() |
Bon, je pense que je vais "fermer" le sujet parce que ça me semble difficile de proposer un jeu de test pour ma grosse requête.
Si Oracle refuse les sous-requêtes dans les jointures (du moins dans ma version d'Oracle), on ne peut peut-être pas faire mieux pour ramener tout ce que j'ai à ramener. |
|
|
00
|
|
|
#16 |
![]() ![]() |
Je suis persuadé que si ! Regardez comment est construite la requête, on retrouve deux branches distinctes avec quasiment les mêmes tables dedans.
Le distinct sur ce genre de requête pourrait indiquer soit un problème de modélisation, soit un problème au niveau de l'écriture de la requête. En utilisant les techniques de pivot et de fonctions d'agrégat pour retrouver la dernière valeur associée à une date je pense qu'on peut améliorer la requête.
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#17 | |
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 643 ![]() |
Citation:
Je regarde cette après-midi ce qui cause cette différence. Où penses-tu qu'il manquerait des aggrégats? C'est quoi les "techniques de pivots" que tu évoques? |
|
|
|
00
|
|
|
#18 | ||||
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 643 ![]() |
Il y a un truc qui ne "va pas" dès le début de la création des 2 branches parallèles :
Code :
Par contre là où je sens peu d'espoir (hors chantier de changement des index sur la base en réflexion en parallèle), c'est que rien que ce bout de requête prend déjà 1/3 du temps de la grosse requête proposée initialement : Donc comme il faut aussi aller faire le même genre de chose pour l'autre branche on explique déjà 2/3 du temps sans rien pouvoir faire, le reste étant les recherches annexes... Code :
|
||||
|
|
00
|
|
|
#19 |
![]() ![]() |
Oui j'avais sucré une de ces deux jointures dans ma requête, compte tenu qu'il s'agit du même prédicat de jointure et qu'à ce stade il n'y a pas encore de différenciation entre les deux branches.
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#20 | |
|
Membre habitué
![]() Inscription : décembre 2004 Messages : 643 ![]() |
Citation:
PS : j'ai enrichi mon message précédent (cf partie 2) |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com