|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Membre éprouvé
![]() Inscription : septembre 2004 Messages : 465 ![]() |
Bonjour.
Je souhaite optimiser une requête qui me pose des problèmes de performances. Le principe: je souhaite sélectionner les lignes d'une table t1, dont une colonne est présente dans un intervalle (entre 2 colonnes) de t2, mais les données ramenées ne sont pas les mêmes selon le nombre d'occurrences trouvées dans t2. J'ai décomposé cela en 2 requêtes. Quand il y a 0 ou plusieurs intervalles dans t2: Code :
Code :
Il y a des index sur t1.col4, t2.borneinf et t2.bornesup (qui sont des number), les stats sont calculées. Oracle 10g. Quand je lance la procédure, je fais un "INSERT ...SELECT..." avec les SELECT ci-dessus, en /*+ APPEND */. Je suis persuadé qu'il y a un moyen d'écrire ça autrement mais je sèche (et je suis très à la bourre dans les dev...). Si vous avez une idée, merci d'avance, vous allez me sauver!!!
|
||||
|
|
00
|
|
|
#2 |
![]() ![]() |
Un petit jeu de test et ce sera parfait !
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#3 | ||
|
Membre éprouvé
![]() Inscription : septembre 2004 Messages : 465 ![]() |
Bonjour Waldar.
Comme je ne peux pas faire de copier coller (car je bosse sous une VM Code :
Edit: les col1, col2 et col3 de table1 n'ont pas d'importance en soi, col2 suffira pour identifier les lignes. Edit2: la table table2 est déjà une extraction d'une autre table. L'idée que j'ai - dans le cas où les requêtes seraient trop lourdes - est de séparer cette table en 2 tables, avec d'un côté les lignes avec un intervalle en un seul exemplaire, de l'autre les lignes avec intervalles en doublons. Ca éviterait de faire le count(*) group by, il ne resterait que la comparaison. |
||
|
|
00
|
|
|
#4 | ||||||||
|
Membre éprouvé
![]() Inscription : septembre 2004 Messages : 465 ![]() |
MA solution fonctionnelle a l'air pas mal et rapide. Dans ma table t2, je ne garde que les lignes avec les intervalles en un seul exemplaire car je n'ai pas besoin des données que dans le cas ou il y a un seul intervalle.
Ca se résumera donc à cela: Quand il y a 0 ou plusieurs intervalles dans t2: Code :
Code :
Au départ, ma table2 est définie ainsi: Code :
Code :
Une idée? |
||||||||
|
|
00
|
|
|
#5 |
![]() ![]() |
Beaucoup d'informations, au final ce n'est plus très clair de ce que vous voulez faire !
Entre la requête multi intervalle, les create tables vous m'avez perdu ! Une petite synthèse ?
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#6 | ||||
|
Membre éprouvé
![]() Inscription : septembre 2004 Messages : 465 ![]() |
Effectivement, trop d'infos tue l'info, d'autant que ma vision a évolué depuis.
![]() Au final, mon problème se résume à cela: je fais deux actions (un CREATE et un DELETE) pour avoir les données souhaitées dans une table, j'aimerais directement créer la table en une seule fois sans avoir à faire de DELETE. Action 1: Code :
Code :
Ca m'échappe... Merci d'avance. |
||||
|
|
00
|
|
|
#7 | ||
![]() ![]() |
Donc tous les intervalles présents plusieurs fois ne sont pas à insérer (même pas en un exemplaire) ?
Quelque chose dans ce goût-là je dirai : Code :
__________________
Email : http://scr.im/waldar |
||
|
00
|
|
|
#8 |
|
Membre éprouvé
![]() Inscription : septembre 2004 Messages : 465 ![]() |
Ah la la, je ne suis pas encore à l'aise avec les PARTITION BY...
Et je ne pensais pas qu'on pouvait utiliser un WITH dans un CREATE. Effectivement, on ne prend pas les intervalles multiples car on n'a pas besoin de leurs données. Je teste ça et je te dis quoi.
|
|
|
00
|
|
|
#9 |
|
Membre éprouvé
![]() Inscription : septembre 2004 Messages : 465 ![]() |
Ca fonctionne.
C'est déjà ça de réglé. J'ai un autre souci mais c'est un autre sujet. Merci Waldar.
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com