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
j'ai également un Index pour améliorer la rapidité :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 ID integer CLIENT_ID integer RESULT integer
=> un client aura plusieurs lignes
Code : Sélectionner tout - Visualiser dans une fenêtre à part CREATE DESC INDEX IRESULT ON HISTORY(RESULT)
=> 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 :
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 SELECT ID, CLIENT_ID FROM HISTORY ORDER BY RESULT DESC
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
Partager