1 pièce(s) jointe(s)
Requête avec jointure en comparaison
(re)Bonjour.
J'ai un souci de performances sur cette requête assez simple:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| WITH table1 AS (
SELECT 1 AS col1, 150 AS col2 FROM dual union ALL
SELECT 2 AS col1, 250 AS col2 FROM dual union ALL
SELECT 3 AS col1, 350 AS col2 FROM dual union ALL
SELECT 4 AS col1, 450 AS col2 FROM dual union ALL
SELECT 5 AS col1, 550 AS col2 FROM dual union ALL
SELECT 6 AS col1, 650 AS col2 FROM dual),
table2 AS (
SELECT 1 AS col1, 100 AS borneinf, 199 AS bornesup FROM dual union ALL
SELECT 2 AS col1, 200 AS borneinf, 299 AS bornesup FROM dual union ALL
SELECT 3 AS col1, 300 AS borneinf, 399 AS bornesup FROM dual union ALL
SELECT 4 AS col1, 400 AS borneinf, 499 AS bornesup FROM dual)
SELECT t1.*, t2.col4
FROM table1 t1, table2 t2
WHERE t1.col2 >= t2.borneinf
AND t1.col2 <= t2.bornesup; |
J'ai des index sur les éléments de comparaison (t1.col2, t2.borneinf et t2.bornesup) qui sont des NUMBER.
t1 fait 64 000 lignes, et t2 fait 134 000 lignes. L'insertion de ce select dans une table vide prend 2h...... alors que t1 contiendra 900 000 lignes.:roll:
L'explain plan est en pièce joint. C'est le MERGE qui coince...
Une précision: dans la table t2, chaque intervalle [borneinf; bornesup] n'est qu'en un seul exemplaire, et les intervalles ne se chevauchent pas. Il faudrait que pour chaque ligne, la comparaison s'arrête dès qu'on en a trouvé un (il peut n'y avoir aucun intervalle).
Merci pour votre aide! :D