PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Le prestazioni non vengono aumentate nemmeno con la dimensione work_mem

L'aumento di work_mem sembrava rendere l'ordinamento circa 8 volte più veloce:(172639.670 - 169311.063) / (167975.549 - 167570.669) . Ma poiché l'ordinamento ha occupato solo una piccola parte del tempo di esecuzione complessivo, renderlo anche 1000 volte più veloce non può rendere le cose molto migliori nel complesso. È la scansione sequenziale che sta prendendo tempo.

La maggior parte del tempo nella scansione di sequenza è probabilmente dedicato a IO. Puoi vedere eseguendo EXPLAIN (ANALYZE, BUFFERS) dopo aver attivato track_io_timing.

Inoltre, la parallelizzazione di una scansione sequenziale spesso non è molto utile, poiché il sistema IO è solitamente in grado di fornire la sua piena capacità a un singolo lettore, grazie alla magia del readahead. E a volte i lettori paralleli possono persino calpestarsi l'un l'altro, peggiorando l'intera performance. Puoi disabilitare la parallelizzazione con set max_parallel_workers_per_gather TO 0; Ciò potrebbe rendere le cose più veloci e, in caso contrario, renderà il piano EXPLAIN più facile da capire.

Stai recuperando oltre il 3% della tabella:193963 / (193963 + 6041677) . Gli indici potrebbero non essere molto utili quando ne stai recuperando così tanto. Se dovessero esserlo, vorresti un indice combinato, non quelli individuali. Quindi vorresti un indice su (client, event_name, date(datetime)) . Quindi dovresti anche modificare la query per utilizzare date(datetime) anziché to_char(datetime, 'YYYY-MM-DD') . Devi apportare questa modifica perché to_char non è immutabile e quindi non può essere indicizzato.