-hackers, I'm working on a vacuum verbose log analyzer for a few weeks now. My goal is to allow a more systematic study of this log output to help improve the vacuum strategy.
To do so, I spent a few hours studying the vacuum code and especially the way it logs what it's doing. What surprises me is: * the inconsistency between the display of the duration for lazy vacuum and vacuum full (especially the index cleanup included in the former case and not in the latter) * the fact that there are quite a lot of work done outside of the duration calculated and displayed in the log (the vacuum_heap/repair_frag step for example). The consequence is that it's really hard to figure out how much time was elapsed for each table. Moreover in the case of a vacuum analyze, the analyze operation is not included at all in the time elapsed and we can't know how long it was for each table. I attached an analysis on how it works currently. I'd like to be able to find in the log the time really elapsed for each operation. I'll probably be able to write a patch for this but I'd like to know if anybody else think it's worth it and if anybody has advice/ideas on how to do it nicely. Regards, -- Guillaume
vacuum for each relation vacuum_rel full_vacuum_rel (if vacuum full) scan_heap pg_rusage_init(&ru0); ereport(vacuuming tableX); vacuum the table ereport(all information + pg_rusage_show(&ru0)) for each index vacuum_index pg_rusage_init(&ru0); clean the index ereport(all information + pg_rusage_show(&ru0)) check for tuple count mismatch vacuum_heap or repair_frag update free space map update statistics in pg_class report results to the stat collector lazy_vacuum_rel (if vacuum) open the indexes lazy_scan_heap pg_rusage_init(&ru0); ereport(vacuuming tableX); for each index lazy_vacuum_index pg_rusage_init(&ru0); clean the index ereport(all information + pg_rusage_show(&ru0)) lazy_vacuum_heap ereport(all information + pg_rusage_show(&ru0)) close the indexes optionnaly truncate the relation update free space map update statistics in pg_class report results to the stat collector vacuum_rel(toast table if any) same as above analyze_rel (if analyze)
---------------------------(end of broadcast)--------------------------- TIP 2: Don't 'kill -9' the postmaster