Bonjour,

Je cherche à optimiser une requête, et je ne suis pas bon pour ça. Le problème (très simplifié) est le suivant :

une Table HISTORY
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
ID integer
CLIENT_ID integer
RESULT integer
j'ai également un Index pour améliorer la rapidité :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
CREATE DESC INDEX IRESULT ON HISTORY(RESULT)
=> un client aura plusieurs lignes
=> cette table peut avoir 1000000 de lignes
=> je cherche à récupérer très rapidement l'ID des X (compris entre 5 et 20) premières lignes des meilleures résultats - mais chaque client ne doit apparaitre qu'une seule fois.

Pour l'instant la méthode la plus rapide est très simple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
SELECT ID, CLIENT_ID FROM HISTORY
ORDER BY RESULT DESC
puis je filtre les CLIENT_ID dans mon code pour ne garder que les premières lignes de chaque client. Le problème est que Firebird va parcourir et verrouiller toutes les lignes pour au final ne garder qu'une dizaine de lignes... Mais y a-t-il un moyen de demander à Firebird de faire ce filtre directement lui-même. Par exemple (cette requête n'est pas correct, mais c'est pour montrer ce que je veux faire) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
SELECT ID, DISTINCT(CLIENT_ID) FROM HISTORY
ORDER BY RESULT DESC
ROWS 20