Vous n'êtes pas identifié(e).
Pages : 1
Bonjour à tou(te)s,
je vous propose ce sujet si vous le permettez,
une requête de jointure simple :
select * from table1 t1 join table2 t2 on t1.c1 = t2.c2;
t1 = 760000 rows
t2 = 15000000 rows
c1 = integer avec btree index et unique constraint
c2 = integer avec btree index
maintenance_work_mem = 224MB
checkpoint_completion_target = 0.9
effective_cache_size = 2816MB
work_mem = 64MB
wal_buffers = 16MB
shared_buffers = 896MB
max_connections = 200
explain analyze buffer select * from table1 t1 join table2 t2 on t1.c1 = t2.c2:
Merge Join (cost=13.07..695479.32 rows=15118257 width=2410) (actual time=0.022..8080.992 rows=15116864 loops=1)
Merge Cond: (t1.t1_inst_id_ = t2.t1_inst_id_)
Buffers: shared hit=97064 read=261175
-> Index Scan using table1_t1_inst_id__key on table1 t1 (cost=0.42..23766.66 rows=758949 width=1793) (actua
l time=0.010..176.442 rows=758997 loops=1)
Buffers: shared hit=9558 read=12085
-> Index Scan using act_idx_hi_t1t2_t1_inst on table2 t2 (cost=0.43..481117.29 rows=15118257 width=617) (actual tim
e=0.006..3352.968 rows=15116864 loops=1)
Buffers: shared hit=87506 read=249090
Planning Time: 0.360 ms
Execution Time: 8748.590 ms
(9 lignes)
OS: centos 7
pgsql : 9.3
je voulais vous demander quelles seraient les techniques d'optimisation pour celà svp.
en effet il n'y a pas de clause where pour discriminer un minimum...
l'explain indique un temps d'exécution de 9 secondes alors que la requete en prends plus de 100000 Milli-Secondes...
Merci beaucoup
Dernière modification par coucou78187 (21/03/2019 17:46:25)
Hors ligne
Bonjour,
Il n'y a pas vraiment d'optimisation possible, à part avoir plus de RAM étant donné qu'il y a beaucoup d'accès en dehors du cache de postgres (environ 2 Go). La différence de temps entre l'explain et l'exécution est probablement simplement le temps de transférer et afficher les 15 millions de lignes.
Julien.
https://rjuju.github.io/
Hors ligne
Bonjour Julien,
Merci beaucoup pour vos éclairages et conseils
Hors ligne
Un petit ajout. Si vous aviez configuré track_io_timing à on, vous auriez le temps des demandes de lecture et écriture au noyau. C'est le seul vrai moyen pour dire si c'est ça qui pose problème.
Guillaume.
Hors ligne
Pages : 1