Bonjour à tous :
Voila, j'ai une table très simple à 3 champs entier : origine,destination,temps
La table se présente comme ça :
origine;destination;temps(minutes)
1 ; 2 ; 5
1 ; 3 ; 6
1 ; 4 ; 7
2 ; 1 ; 8
2 ; 3 ; 9
2 ; 4 ; 10
....
sur 70 millions de lignes
cette table s'appelle matrice_tc_di dans un schéma transport,
en gros j'ai des origines et des destinations modélisées par des entiers et un temps entre ces origines et ces destinations en minutes.
J'ai posé un index unique tc_di_idx sur le couple (origine,destination)
et un autre index tc_di_dst_idx (BTREE) sur le couple (destination,origine)
La requête select * from transport.matrice_tc_di where origine = 5 ; est instantanée
Par contre la requête select * from transport.matrice_tc_di where destination = 5 ; met 2 minutes !
Avez vous une idée pour arranger ce problème ?
Voici les traces pour les 2 requêtes :
NB : Je suis postgres 8.2.1 sur un Linux !select * from transport.matrice_tc_di where origine = 5 ;
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------
Bitmap Heap Scan on matrice_tc_di (cost=5274.51..319261.40 rows=281302 width=12) (actual time=2.105..32.657 rows=7539 loops=1)
Recheck Cond: (origine = 5)
-> Bitmap Index Scan on tc_di_idx (cost=0.00..5204.19 rows=281302 width=0) (actual time=2.093..2.093 rows=7539 loops=1)
Index Cond: (origine = 5)
Total runtime: 61.053 ms
(5 rows)
select * from transport.matrice_tc_di where destination = 5
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------
Bitmap Heap Scan on matrice_tc_di (cost=5274.51..319261.40 rows=281302 width=12) (actual time=159.886..121864.426 rows=7461 loops=1)
Recheck Cond: (destination = 5)
-> Bitmap Index Scan on tc_di_dst_idx (cost=0.00..5204.19 rows=281302 width=0) (actual time=144.149..144.149 rows=7461 loops=1)
Index Cond: (destination = 5)
Total runtime: 121988.927 ms
(5 rows)
J'ai essayé d'augmenter le paramètre work_mem mais ça ne sert à rien.
Comment faire pour que mes 2 requêtes prennent le même temps d'exécution ?
Merci pour vos idées et très bonne soirée à tous.
Partager