Thread: max freeze age query in docs

max freeze age query in docs

From
Andrew Dunstan
Date:
The other day I followed the docs and ran this query:
   SELECT relname, age(relfrozenxid) FROM pg_class WHERE relkind = 'r';


Then after identifying some tables that were close to triggering an 
automatic vacuum, we vacuumed them only to find that the age of the 
database's datfrozenxid hadn't gone down much. A little digging revealed 
that some TOAST tables had some quite old xids hanging around. so I 
think we need to change the query, maybe to something like:
   select c.relname, int4larger(age(c.relfrozenxid),                              case when c.reltoastrelid = 0 then 0
else  age(t.relfrozenxid) end) as age   from pg_class c       left join pg_class t on c.reltoastrelid = t.oid   where
c.relkind= 'r'
 

Maybe for bonus points we'd print out the schema (e.g. by selectting 
c.oid::regclass instead of c.relname), and also include materialized 
views which are omitted from the query altogether.

Comments?

cheers

andrew




Re: max freeze age query in docs

From
Josh Berkus
Date:
> Maybe for bonus points we'd print out the schema (e.g. by selectting
> c.oid::regclass instead of c.relname), and also include materialized
> views which are omitted from the query altogether.

Given the importance of this, maybe we need to have it as part of
pg_stat_user_tables?


-- 
Josh Berkus
PostgreSQL Experts Inc.
http://pgexperts.com



Re: max freeze age query in docs

From
Andrew Dunstan
Date:
On 09/01/2013 10:33 PM, Josh Berkus wrote:
>> Maybe for bonus points we'd print out the schema (e.g. by selectting
>> c.oid::regclass instead of c.relname), and also include materialized
>> views which are omitted from the query altogether.
> Given the importance of this, maybe we need to have it as part of
> pg_stat_user_tables?
>
>

Yes, possibly, but we can't do that now, but I would like to fix the 
docs now.

cheers

andrew



Re: max freeze age query in docs

From
Tom Lane
Date:
Andrew Dunstan <andrew@dunslane.net> writes:
> Yes, possibly, but we can't do that now, but I would like to fix the 
> docs now.

If you want this in 9.3.0 it needs to be committed in the next couple of
hours.

FWIW, the idea seemed generally sane to me, but I'd suggest not depending
on reltoastrelid being zero when and only when there's no match.
Why not test whether t.oid IS NULL, instead?

Or actually, code it like this
  GREATEST(age(c.relfrozenxid), age(t.relfrozenxid))

and be done, as well as not having an ugly direct use of int4larger.
        regards, tom lane



Re: max freeze age query in docs

From
Andrew Dunstan
Date:
On 09/02/2013 01:30 PM, Tom Lane wrote:
> Andrew Dunstan <andrew@dunslane.net> writes:
>> Yes, possibly, but we can't do that now, but I would like to fix the
>> docs now.
> If you want this in 9.3.0 it needs to be committed in the next couple of
> hours.
>
> FWIW, the idea seemed generally sane to me, but I'd suggest not depending
> on reltoastrelid being zero when and only when there's no match.
> Why not test whether t.oid IS NULL, instead?
>
> Or actually, code it like this
>
>     GREATEST(age(c.relfrozenxid), age(t.relfrozenxid))
>
> and be done, as well as not having an ugly direct use of int4larger.
>
>         


OK, I'll do it that way. Working on it now.

cheers

andrew

cheers

andrew




Re: max freeze age query in docs

From
Andres Freund
Date:
On 2013-09-02 14:20:57 -0400, Andrew Dunstan wrote:
> 
> On 09/02/2013 01:30 PM, Tom Lane wrote:
> >Andrew Dunstan <andrew@dunslane.net> writes:
> >>Yes, possibly, but we can't do that now, but I would like to fix the
> >>docs now.
> >If you want this in 9.3.0 it needs to be committed in the next couple of
> >hours.
> >
> >FWIW, the idea seemed generally sane to me, but I'd suggest not depending
> >on reltoastrelid being zero when and only when there's no match.
> >Why not test whether t.oid IS NULL, instead?
> >
> >Or actually, code it like this
> >
> >    GREATEST(age(c.relfrozenxid), age(t.relfrozenxid))
> >
> >and be done, as well as not having an ugly direct use of int4larger.
> >
> >        
> 
> 
> OK, I'll do it that way. Working on it now.

I'd vote for c.relkind != 't' AND NOT c.relfrozenxid = 0; instead of
relkind = 'r' for the main relation, that way you'd include materialized
views and stuff.

Greetings,

Andres Freund

-- Andres Freund                       http://www.2ndQuadrant.com/PostgreSQL Development, 24x7 Support, Training &
Services



Re: max freeze age query in docs

From
Andrew Dunstan
Date:
On 09/02/2013 02:26 PM, Andres Freund wrote:
> On 2013-09-02 14:20:57 -0400, Andrew Dunstan wrote:
>> On 09/02/2013 01:30 PM, Tom Lane wrote:
>>> Andrew Dunstan <andrew@dunslane.net> writes:
>>>> Yes, possibly, but we can't do that now, but I would like to fix the
>>>> docs now.
>>> If you want this in 9.3.0 it needs to be committed in the next couple of
>>> hours.
>>>
>>> FWIW, the idea seemed generally sane to me, but I'd suggest not depending
>>> on reltoastrelid being zero when and only when there's no match.
>>> Why not test whether t.oid IS NULL, instead?
>>>
>>> Or actually, code it like this
>>>
>>>     GREATEST(age(c.relfrozenxid), age(t.relfrozenxid))
>>>
>>> and be done, as well as not having an ugly direct use of int4larger.
>>>
>>>         
>>
>> OK, I'll do it that way. Working on it now.
> I'd vote for c.relkind != 't' AND NOT c.relfrozenxid = 0; instead of
> relkind = 'r' for the main relation, that way you'd include materialized
> views and stuff.
>

See what was just committed - the matview case is included for 9.3+ (as 
it was in fact in the original - I must have been looking at older docs 
when saw it wasn't there.)

I'll be back in an hour or so if any final tweeks are needed.

cheers

andrew