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 : 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)
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
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)
La table t1 fait 900 000 lignes, la table t2 en fait 130 000.
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!!!