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:
Quand il y a effectivement un seul intervalle, ça se complique car j'ai besoin de récupérer certaines données de t2:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 SELECT t1.col1, t1.col2, t1.col3 FROM table1 t1 WHERE NOT EXISTS (SELECT COUNT(*), t2.borneinf, t2.bornesup FROM table2 t2 WHERE t1.col4 >= t2.borneinf AND t1.col4 <= t2.bornesup GROUP BY t2.borneinf, t2.bornesup HAVING COUNT(*) = 1)
La table t1 fait 900 000 lignes, la table t2 en fait 130 000.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 SELECT t1.col1, t1.col2, t2.col1 FROM table1 t1, table2 t2 WHERE t1.col4 >= t2.borneinf AND t1.col4 <= t2.bornesup AND EXISTS (SELECT COUNT(*), t2.borneinf, t2.bornesup FROM table2 t2 WHERE t1.col4 >= t2.borneinf AND t1.col4 <= t2.bornesup GROUP BY t2.borneinf, t2.bornesup HAVING COUNT(*) = 1)
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!!!![]()
Partager