Fix logic in lazy vacuum to decide if it's worth trying to truncate the heap.
If the table was smaller than REL_TRUNCATE_FRACTION (= 16) pages, we always tried to acquire AccessExclusiveLock on it even if there was no empty pages at the end. Report by Simon Riggs. Back-patch all the way to 7.4.
This commit is contained in:
parent
b25433da5d
commit
7ffe657225
@ -29,7 +29,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/commands/vacuumlazy.c,v 1.115 2009/01/01 17:23:40 momjian Exp $
|
* $PostgreSQL: pgsql/src/backend/commands/vacuumlazy.c,v 1.116 2009/01/06 14:55:37 heikki Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -183,8 +183,9 @@ lazy_vacuum_rel(Relation onerel, VacuumStmt *vacstmt,
|
|||||||
* number of pages. Otherwise, the time taken isn't worth it.
|
* number of pages. Otherwise, the time taken isn't worth it.
|
||||||
*/
|
*/
|
||||||
possibly_freeable = vacrelstats->rel_pages - vacrelstats->nonempty_pages;
|
possibly_freeable = vacrelstats->rel_pages - vacrelstats->nonempty_pages;
|
||||||
if (possibly_freeable >= REL_TRUNCATE_MINIMUM ||
|
if (possibly_freeable > 0 &&
|
||||||
possibly_freeable >= vacrelstats->rel_pages / REL_TRUNCATE_FRACTION)
|
(possibly_freeable >= REL_TRUNCATE_MINIMUM ||
|
||||||
|
possibly_freeable >= vacrelstats->rel_pages / REL_TRUNCATE_FRACTION))
|
||||||
lazy_truncate_heap(onerel, vacrelstats);
|
lazy_truncate_heap(onerel, vacrelstats);
|
||||||
|
|
||||||
/* Vacuum the Free Space Map */
|
/* Vacuum the Free Space Map */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user