Améliorer les performances d'une requête avec agrégats
Bonjour,
J'ai un soucis avec une requête qui prend trop de temps pour être utilisable. Il me semble que c'est un soucis classique, mais je n'ai pas trouvé de réponse claire, donc merci pour votre aide.
La requête en question ne concerne qu'une table :
Code:
1 2 3
| SELECT trials, block, sum(omission), sum(comission), avg(response_time)
FROM temp
GROUP BY trials, block; |
Elle consiste comme vous le voyez à deux some et une moyenne, groupés sur deux autre variables, et sans filtres. Les colonnes omission et comission sont du type integer, response_time float, trials et block de type varchar. Il y a 500 000 lignes dans la table, ce qui logiquement représente au pire la moitié de ce qu'elle contiendra pour finir.
Dans ces conditions la requête dure 24 secondes. Si je retire une des deux variables trials ou block de la requête, cela prend moins d'une seconde.
Est-il possible d'améliorer cela ? Je peux bien sûr calculer ces valeurs et les stocker dans une table séparée, mais j'aimerai vraiment savoir s'il est possible d'accélérer ces performances. Voici le plan de requête :
Code:
1 2 3 4 5 6 7 8
| QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------
GroupAggregate (cost=113849.63..121261.63 rows=40000 width=76) (actual time=19115.558..24052.907 rows=82803 loops=1)
-> Sort (cost=113849.63..114968.30 rows=447467 width=76) (actual time=19115.515..23454.204 rows=447467 loops=1)
Sort Key: trials_trial_psytool_reactionti_id, block
-> Seq Scan on temp_palp (cost=0.00..32084.67 rows=447467 width=76) (actual time=0.049..461.138 rows=447467 loops=1)
Total runtime: 24096.526 ms
(5 lignes) |
Merci