Bonjour,
J'ai deux tables (en gras les PK) :
inverted_index: id_token, id_doc, positions (643 649 788 lignes)
tokens: id_token, token (12 310 981 lignes)
Je me demande de quelle manière est indexée une clé primaire composée de deux champs ? J'utilise ces deux champs dans une requête et mais les performances sont très mauvaises.
Voici la requête et l'explain analyze sur cette requête :
Code : Sélectionner tout - Visualiser dans une fenêtre à part select * from tokens where not exists (select * from inverted_index as i where i.id_token = tokens.id_token and i.id_doc != $1)Je ne suis pas bien sûr de ce que dit le plan, mais il me semble qu'il y a un scan complet de la table inverted_index au sein de la boucle. J'aurais naturellement pensé que la requête prendrait un sous ensemble de cette table (lorsque l'id_token est le même) pour comparer id_doc, et que l'index sur inverted_index.id_token serait utilisé pour créer ce sous ensemble.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 QUERY PLAN --------------------------------------------------------------------------------------------------------------------------------------------------- Hash Anti Join (cost=24313919.19..27316902.92 rows=12324415 width=15) (actual time=36183259.188..154041487.640 rows=7 loops=1) Hash Cond: (tokens.id_token = i.id_token) -> Seq Scan on tokens (cost=0.00..202202.34 rows=12345034 width=15) (actual time=0.034..7072.352 rows=12310981 loops=1) -> Hash (cost=13754336.40..13754336.40 rows=643631663 width=4) (actual time=5775623.425..5775623.425 rows=643649781 loops=1) -> Seq Scan on inverted_index i (cost=0.00..13754336.40 rows=643631663 width=4) (actual time=0.027..3650670.164 rows=643649781 loops=1) Filter: (id_doc <> $1) Total runtime: 154042117.430 ms
Partager