bonjours à toutes et tous,

sur une table de plus de cent (107 pour être exact en ce moment) millions d'enregistrements composée pour l'essentiel de: numero number(4), article number(10), groupe number(2), infos number(10), ...

je fais:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
select 
  numero, groupe, sum(infos)
from matable 
where numero between 10 and 20 and article = 100
group by numero, groupe
réponse instantanée, normal, j'ai un index sur numero, article et groupe

mais:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
select 
  t.numero, t.groupe, sum(t.infos)
from matable t
where t.numero = ( select max( t2.numero ) from matable t2
                   where t2.numero  < t.numero
                     and t2.article = t.article
                 )
  and t.article = 100
group by t.numero, t.groupe
là, il faut bien 1 à 3 secondes pour obtenir la réponse. le premier réflèxe que j'ai eu et de créer un index: blabla( "numero" desc, article )
en me disant comme je cherche en fait le total précédent (donc en descendant) cela devrait booster la chose, mais non.

il faut savoir que la table (environ 7 gigas) et dans un tablespace dédié et les index dans un autre tablespace.

donc, je me plante dans mes index, puisque lorsque je cherche à faire la somme sur un "numero" précis j'ai je résultat instantanément (si si!) et lorsque je recherche le numéro qui précéde le numero en cours "select max(numero)... where numero < numero and article = 100" là, c'est très long (1 à 2 secondes, rigolez pas!)

la question est donc quel index créer pour que la recherche "arrière" donne un résultat plus rapide à ce type de requête?

merci de votre aide.