Thread: Re: [previously on HACKERS] "Compacting" a relation

Re: [previously on HACKERS] "Compacting" a relation

From
"Simon Riggs"
Date:
On Mon, 2007-02-05 at 11:55 +0000, Simon Riggs wrote:
> On Sat, 2007-02-03 at 22:11 -0500, Bruce Momjian wrote:
> > Tom Lane wrote:
> > > Peter Eisentraut <peter_e@gmx.net> writes:
> > > > vacuumlazy.c contains a hint "Consider compacting this relation" but AFAICT,
> > > > there is no indication anywhere how "compacting" is supposed to be achieved.
> > > > I guess this means VACUUM FULL or CLUSTER, but I don't think the hint can be
> > > > processed effectively by a user.
> > >
> > > So change it ...
> >
> > New message is:
> >
> >   errhint("Consider using VACUUM FULL on this relation or increasing the configuration parameter
\"max_fsm_pages\".")));
> >
>
> The change of wording may be appropriate, but it is triggered when
>
>     if (vacrelstats->tot_free_pages > MaxFSMPages)
>
> So if you VACUUM a 15+GB table and it has only 1% freespace then it will
> still generate this message. Hopefully you'd agree that the message
> would be inappropriate in that case.
>
> It's also inappropriate because this message is generated *prior* to
> doing lazy_truncate_heap(), which could easily remove lots of empty
> pages anyhow. That might reduce it to less than MaxFSMPages anyhow, so
> it can currently be triggered in wholly inappropriate situations.
>
> So I suggest that we move this wording after lazy_truncate_heap() in
> lazy_vacuum_rel() *and* we alter the hint so that it only suggests
> VACUUM FULL if the table has 20% fragmentation, whatever its size.
>
> Happy to drop a patch for this, if people agree.

Enclose 2 versions:
v1 - move test and WARNING
v2 - move test and WARNING, plus adjust hint according to relation size

--
  Simon Riggs
  EnterpriseDB   http://www.enterprisedb.com


Attachment

Re: [previously on HACKERS] "Compacting" a relation

From
Bruce Momjian
Date:
Your patch has been added to the PostgreSQL unapplied patches list at:

    http://momjian.postgresql.org/cgi-bin/pgpatches

It will be applied as soon as one of the PostgreSQL committers reviews
and approves it.

---------------------------------------------------------------------------


Simon Riggs wrote:
> On Mon, 2007-02-05 at 11:55 +0000, Simon Riggs wrote:
> > On Sat, 2007-02-03 at 22:11 -0500, Bruce Momjian wrote:
> > > Tom Lane wrote:
> > > > Peter Eisentraut <peter_e@gmx.net> writes:
> > > > > vacuumlazy.c contains a hint "Consider compacting this relation" but AFAICT,
> > > > > there is no indication anywhere how "compacting" is supposed to be achieved.
> > > > > I guess this means VACUUM FULL or CLUSTER, but I don't think the hint can be
> > > > > processed effectively by a user.
> > > >
> > > > So change it ...
> > >
> > > New message is:
> > >
> > >   errhint("Consider using VACUUM FULL on this relation or increasing the configuration parameter
\"max_fsm_pages\".")));
> > >
> >
> > The change of wording may be appropriate, but it is triggered when
> >
> >     if (vacrelstats->tot_free_pages > MaxFSMPages)
> >
> > So if you VACUUM a 15+GB table and it has only 1% freespace then it will
> > still generate this message. Hopefully you'd agree that the message
> > would be inappropriate in that case.
> >
> > It's also inappropriate because this message is generated *prior* to
> > doing lazy_truncate_heap(), which could easily remove lots of empty
> > pages anyhow. That might reduce it to less than MaxFSMPages anyhow, so
> > it can currently be triggered in wholly inappropriate situations.
> >
> > So I suggest that we move this wording after lazy_truncate_heap() in
> > lazy_vacuum_rel() *and* we alter the hint so that it only suggests
> > VACUUM FULL if the table has 20% fragmentation, whatever its size.
> >
> > Happy to drop a patch for this, if people agree.
>
> Enclose 2 versions:
> v1 - move test and WARNING
> v2 - move test and WARNING, plus adjust hint according to relation size
>
> --
>   Simon Riggs
>   EnterpriseDB   http://www.enterprisedb.com
>

[ Attachment, skipping... ]

[ Attachment, skipping... ]

--
  Bruce Momjian  <bruce@momjian.us>          http://momjian.us
  EnterpriseDB                               http://www.enterprisedb.com

  + If your life is a hard drive, Christ can be your backup. +

Re: [previously on HACKERS] "Compacting" a relation

From
Bruce Momjian
Date:
I applied the optional VACUUM FULL version, but modified to code to say
20% rather than a factor of 5, attached.

---------------------------------------------------------------------------

Simon Riggs wrote:
> On Mon, 2007-02-05 at 11:55 +0000, Simon Riggs wrote:
> > On Sat, 2007-02-03 at 22:11 -0500, Bruce Momjian wrote:
> > > Tom Lane wrote:
> > > > Peter Eisentraut <peter_e@gmx.net> writes:
> > > > > vacuumlazy.c contains a hint "Consider compacting this relation" but AFAICT,
> > > > > there is no indication anywhere how "compacting" is supposed to be achieved.
> > > > > I guess this means VACUUM FULL or CLUSTER, but I don't think the hint can be
> > > > > processed effectively by a user.
> > > >
> > > > So change it ...
> > >
> > > New message is:
> > >
> > >   errhint("Consider using VACUUM FULL on this relation or increasing the configuration parameter
\"max_fsm_pages\".")));
> > >
> >
> > The change of wording may be appropriate, but it is triggered when
> >
> >     if (vacrelstats->tot_free_pages > MaxFSMPages)
> >
> > So if you VACUUM a 15+GB table and it has only 1% freespace then it will
> > still generate this message. Hopefully you'd agree that the message
> > would be inappropriate in that case.
> >
> > It's also inappropriate because this message is generated *prior* to
> > doing lazy_truncate_heap(), which could easily remove lots of empty
> > pages anyhow. That might reduce it to less than MaxFSMPages anyhow, so
> > it can currently be triggered in wholly inappropriate situations.
> >
> > So I suggest that we move this wording after lazy_truncate_heap() in
> > lazy_vacuum_rel() *and* we alter the hint so that it only suggests
> > VACUUM FULL if the table has 20% fragmentation, whatever its size.
> >
> > Happy to drop a patch for this, if people agree.
>
> Enclose 2 versions:
> v1 - move test and WARNING
> v2 - move test and WARNING, plus adjust hint according to relation size
>
> --
>   Simon Riggs
>   EnterpriseDB   http://www.enterprisedb.com
>

[ Attachment, skipping... ]

[ Attachment, skipping... ]

--
  Bruce Momjian  <bruce@momjian.us>          http://momjian.us
  EnterpriseDB                               http://www.enterprisedb.com

  + If your life is a hard drive, Christ can be your backup. +
Index: src/backend/commands/vacuumlazy.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/commands/vacuumlazy.c,v
retrieving revision 1.83
diff -c -c -r1.83 vacuumlazy.c
*** src/backend/commands/vacuumlazy.c    4 Feb 2007 03:10:55 -0000    1.83
--- src/backend/commands/vacuumlazy.c    21 Feb 2007 22:13:59 -0000
***************
*** 180,185 ****
--- 180,195 ----
      /* Update shared free space map with final free space info */
      lazy_update_fsm(onerel, vacrelstats);

+     if (vacrelstats->tot_free_pages > MaxFSMPages)
+         ereport(WARNING,
+                 (errmsg("relation \"%s.%s\" contains more than \"max_fsm_pages\" pages with useful free space",
+                         get_namespace_name(RelationGetNamespace(onerel)),
+                         RelationGetRelationName(onerel)),
+                  errhint("Consider%sincreasing the configuration parameter \"max_fsm_pages\".",
+                         /* Only suggest VACUUM FULL if 20% free */
+                         (vacrelstats->tot_free_pages > vacrelstats->rel_pages * 0.20
+                             ? " using VACUUM FULL on this relation or ": " "))));
+
      /* Update statistics in pg_class */
      vac_update_relstats(RelationGetRelid(onerel),
                          vacrelstats->rel_pages,
***************
*** 507,519 ****
                         vacrelstats->tot_free_pages,
                         empty_pages,
                         pg_rusage_show(&ru0))));
-
-     if (vacrelstats->tot_free_pages > MaxFSMPages)
-         ereport(WARNING,
-                 (errmsg("relation \"%s.%s\" contains more than \"max_fsm_pages\" pages with useful free space",
-                         get_namespace_name(RelationGetNamespace(onerel)),
-                         relname),
-                  errhint("Consider using VACUUM FULL on this relation or increasing the configuration parameter
\"max_fsm_pages\".")));
  }


--- 517,522 ----

Re: [previously on HACKERS] "Compacting" a relation

From
Alvaro Herrera
Date:
Bruce Momjian wrote:
>
> I applied the optional VACUUM FULL version, but modified to code to say
> 20% rather than a factor of 5, attached.

String construction does not work well with translations; please
reformulate this.

> +                  errhint("Consider%sincreasing the configuration parameter \"max_fsm_pages\".",
> +                         /* Only suggest VACUUM FULL if 20% free */
> +                         (vacrelstats->tot_free_pages > vacrelstats->rel_pages * 0.20
> +                             ? " using VACUUM FULL on this relation or ": " "))));


--
Alvaro Herrera                                http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

Re: [previously on HACKERS] "Compacting" a relation

From
Bruce Momjian
Date:
Alvaro Herrera wrote:
> Bruce Momjian wrote:
> >
> > I applied the optional VACUUM FULL version, but modified to code to say
> > 20% rather than a factor of 5, attached.
>
> String construction does not work well with translations; please
> reformulate this.
>
> > +                  errhint("Consider%sincreasing the configuration parameter \"max_fsm_pages\".",
> > +                         /* Only suggest VACUUM FULL if 20% free */
> > +                         (vacrelstats->tot_free_pages > vacrelstats->rel_pages * 0.20
> > +                             ? " using VACUUM FULL on this relation or ": " "))));

OK, updated.

--
  Bruce Momjian  <bruce@momjian.us>          http://momjian.us
  EnterpriseDB                               http://www.enterprisedb.com

  + If your life is a hard drive, Christ can be your backup. +
Index: src/backend/commands/vacuumlazy.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/commands/vacuumlazy.c,v
retrieving revision 1.84
diff -c -c -r1.84 vacuumlazy.c
*** src/backend/commands/vacuumlazy.c    21 Feb 2007 22:15:21 -0000    1.84
--- src/backend/commands/vacuumlazy.c    21 Feb 2007 22:41:55 -0000
***************
*** 185,194 ****
                  (errmsg("relation \"%s.%s\" contains more than \"max_fsm_pages\" pages with useful free space",
                          get_namespace_name(RelationGetNamespace(onerel)),
                          RelationGetRelationName(onerel)),
!                  errhint("Consider%sincreasing the configuration parameter \"max_fsm_pages\".",
!                         /* Only suggest VACUUM FULL if 20% free */
!                         (vacrelstats->tot_free_pages > vacrelstats->rel_pages * 0.20
!                             ? " using VACUUM FULL on this relation or ": " "))));

      /* Update statistics in pg_class */
      vac_update_relstats(RelationGetRelid(onerel),
--- 185,194 ----
                  (errmsg("relation \"%s.%s\" contains more than \"max_fsm_pages\" pages with useful free space",
                          get_namespace_name(RelationGetNamespace(onerel)),
                          RelationGetRelationName(onerel)),
!                  errhint((vacrelstats->tot_free_pages > vacrelstats->rel_pages * 0.20 ?
!                             /* Only suggest VACUUM FULL if 20% free */
!                             "Consider using VACUUM FULL on this relation or increasing the configuration parameter
\"max_fsm_pages\".": 
!                             "Consider increasing the configuration parameter \"max_fsm_pages\"."))));

      /* Update statistics in pg_class */
      vac_update_relstats(RelationGetRelid(onerel),

Re: [previously on HACKERS] "Compacting" a relation

From
Alvaro Herrera
Date:
Bruce Momjian wrote:
> Alvaro Herrera wrote:
> > Bruce Momjian wrote:
> > >
> > > I applied the optional VACUUM FULL version, but modified to code to say
> > > 20% rather than a factor of 5, attached.
> >
> > String construction does not work well with translations; please
> > reformulate this.
> >
> > > +                  errhint("Consider%sincreasing the configuration parameter \"max_fsm_pages\".",
> > > +                         /* Only suggest VACUUM FULL if 20% free */
> > > +                         (vacrelstats->tot_free_pages > vacrelstats->rel_pages * 0.20
> > > +                             ? " using VACUUM FULL on this relation or ": " "))));
>
> OK, updated.

Thanks :-)


--
Alvaro Herrera                                http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

Re: [previously on HACKERS] "Compacting" a relation

From
"Simon Riggs"
Date:
On Wed, 2007-02-21 at 21:28 -0300, Alvaro Herrera wrote:
> Bruce Momjian wrote:
> > Alvaro Herrera wrote:
> > > Bruce Momjian wrote:
> > > >
> > > > I applied the optional VACUUM FULL version, but modified to code to say
> > > > 20% rather than a factor of 5, attached.
> > >
> > > String construction does not work well with translations; please
> > > reformulate this.
> > >
> > > > +                  errhint("Consider%sincreasing the configuration parameter \"max_fsm_pages\".",
> > > > +                         /* Only suggest VACUUM FULL if 20% free */
> > > > +                         (vacrelstats->tot_free_pages > vacrelstats->rel_pages * 0.20
> > > > +                             ? " using VACUUM FULL on this relation or ": " "))));
> >
> > OK, updated.
>
> Thanks :-)

Alvaro: point noted for future. Bruce: many thanks.

--
  Simon Riggs
  EnterpriseDB   http://www.enterprisedb.com