Re: [PATCHES] Patch(es) to expose n_live_tuples and

2007-01-02 Thread Bruce Momjian

Patch applied.  Thanks.

---

Glen Parker wrote:
> This patch consists of two c functions to expose n_live_tuples and
> n_dead_tuples, SQL functions to expose them to SQL land, and 
> corresponding fields added to pg_stat_all_tables.
> 
> This has been discussed in general.  The purpose is to allow 
> autovacuum-esq conditional vacuuming and clustering using SQL to 
> discover the required stats.
> 
> -Glen Parker

> --- ./src/backend/utils/adt/pgstatfuncs.c.old 2006-12-20 17:01:30.585852856 
> -0800
> +++ ./src/backend/utils/adt/pgstatfuncs.c 2006-12-20 17:00:58.570719896 
> -0800
> @@ -28,6 +28,8 @@
>  extern Datum pg_stat_get_tuples_inserted(PG_FUNCTION_ARGS);
>  extern Datum pg_stat_get_tuples_updated(PG_FUNCTION_ARGS);
>  extern Datum pg_stat_get_tuples_deleted(PG_FUNCTION_ARGS);
> +extern Datum pg_stat_get_live_tuples(PG_FUNCTION_ARGS);
> +extern Datum pg_stat_get_dead_tuples(PG_FUNCTION_ARGS);
>  extern Datum pg_stat_get_blocks_fetched(PG_FUNCTION_ARGS);
>  extern Datum pg_stat_get_blocks_hit(PG_FUNCTION_ARGS);
>  extern Datum pg_stat_get_last_vacuum_time(PG_FUNCTION_ARGS);
> @@ -153,6 +155,38 @@
>  
>  
>  Datum
> +pg_stat_get_live_tuples(PG_FUNCTION_ARGS)
> +{ 
> + Oid relid = PG_GETARG_OID(0);
> + int64   result;
> + PgStat_StatTabEntry *tabentry;
> + 
> + if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
> + result = 0;
> + else
> + result = (int64) (tabentry->n_live_tuples);
> +
> + PG_RETURN_INT64(result);
> +}
> +
> +
> +Datum
> +pg_stat_get_dead_tuples(PG_FUNCTION_ARGS)
> +{
> + Oid relid = PG_GETARG_OID(0);
> + int64   result;
> + PgStat_StatTabEntry *tabentry;
> +
> + if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
> + result = 0;
> + else
> + result = (int64) (tabentry->n_dead_tuples);
> +
> + PG_RETURN_INT64(result);
> +}
> +
> +
> +Datum
>  pg_stat_get_blocks_fetched(PG_FUNCTION_ARGS)
>  {
>   Oid relid = PG_GETARG_OID(0);
> 
> 
> --- ./src/include/catalog/pg_proc.h.old   2006-12-06 10:06:47.0 
> -0800
> +++ ./src/include/catalog/pg_proc.h   2006-12-20 17:09:32.874533832 -0800
> @@ -2872,6 +2872,10 @@
>  DESCR("Statistics: Number of tuples updated");
>  DATA(insert OID = 1933 (  pg_stat_get_tuples_deleted PGNSP PGUID 12 f f t f 
> s 1 20 "26" _null_ _null_ _null_ pg_stat_get_tuples_deleted - _null_ ));
>  DESCR("Statistics: Number of tuples deleted");
> +DATA(insert OID = 2878 (  pg_stat_get_live_tuplesPGNSP PGUID 12 f f t f 
> s 1 20 "26" _null_ _null_ _null_ pg_stat_get_live_tuples - _null_ ));
> +DESCR("Statistics: Number of live tuples");
> +DATA(insert OID = 2879 (  pg_stat_get_dead_tuplesPGNSP PGUID 12 f f t f 
> s 1 20 "26" _null_ _null_ _null_ pg_stat_get_dead_tuples - _null_ ));
> +DESCR("Statistics: Number of dead tuples");
>  DATA(insert OID = 1934 (  pg_stat_get_blocks_fetched PGNSP PGUID 12 f f t f 
> s 1 20 "26" _null_ _null_ _null_ pg_stat_get_blocks_fetched - _null_ ));
>  DESCR("Statistics: Number of blocks fetched");
>  DATA(insert OID = 1935 (  pg_stat_get_blocks_hit PGNSP PGUID 12 
> f f t f s 1 20 "26" _null_ _null_ _null_ pg_stat_get_blocks_hit - _null_ ));
> 
> 
> --- ./src/backend/catalog/system_views.sql.old2006-12-06 
> 10:06:47.0 -0800
> +++ ./src/backend/catalog/system_views.sql2006-12-20 17:13:03.036584344 
> -0800
> @@ -203,10 +203,12 @@
>  pg_stat_get_tuples_returned(C.oid) AS seq_tup_read, 
>  sum(pg_stat_get_numscans(I.indexrelid))::bigint AS idx_scan, 
>  sum(pg_stat_get_tuples_fetched(I.indexrelid))::bigint +
> -pg_stat_get_tuples_fetched(C.oid) AS idx_tup_fetch, 
> +pg_stat_get_tuples_fetched(C.oid) AS idx_tup_fetch, 
>  pg_stat_get_tuples_inserted(C.oid) AS n_tup_ins, 
>  pg_stat_get_tuples_updated(C.oid) AS n_tup_upd, 
>  pg_stat_get_tuples_deleted(C.oid) AS n_tup_del,
> +pg_stat_get_live_tuples(C.oid) AS n_live_tup, 
> +pg_stat_get_dead_tuples(C.oid) AS n_dead_tup,
>  pg_stat_get_last_vacuum_time(C.oid) as last_vacuum,
>  pg_stat_get_last_autovacuum_time(C.oid) as last_autovacuum,
>  pg_stat_get_last_analyze_time(C.oid) as last_analyze,

> 
> ---(end of broadcast)---
> TIP 4: Have you searched our list archives?
> 
>http://archives.postgresql.org

-- 
  Bruce Momjian   [EMAIL PROTECTED]
  EnterpriseDBhttp://www.enterprisedb.com

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

---(end of broadcast)---
TIP 4: Have you searched our list archives?

   http://archives.postgresql.org


Re: [PATCHES] Patch(es) to expose n_live_tuples and

2006-12-27 Thread Bruce Momjian

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.

---

Glen Parker wrote:
> This patch consists of two c functions to expose n_live_tuples and
> n_dead_tuples, SQL functions to expose them to SQL land, and 
> corresponding fields added to pg_stat_all_tables.
> 
> This has been discussed in general.  The purpose is to allow 
> autovacuum-esq conditional vacuuming and clustering using SQL to 
> discover the required stats.
> 
> -Glen Parker

> --- ./src/backend/utils/adt/pgstatfuncs.c.old 2006-12-20 17:01:30.585852856 
> -0800
> +++ ./src/backend/utils/adt/pgstatfuncs.c 2006-12-20 17:00:58.570719896 
> -0800
> @@ -28,6 +28,8 @@
>  extern Datum pg_stat_get_tuples_inserted(PG_FUNCTION_ARGS);
>  extern Datum pg_stat_get_tuples_updated(PG_FUNCTION_ARGS);
>  extern Datum pg_stat_get_tuples_deleted(PG_FUNCTION_ARGS);
> +extern Datum pg_stat_get_live_tuples(PG_FUNCTION_ARGS);
> +extern Datum pg_stat_get_dead_tuples(PG_FUNCTION_ARGS);
>  extern Datum pg_stat_get_blocks_fetched(PG_FUNCTION_ARGS);
>  extern Datum pg_stat_get_blocks_hit(PG_FUNCTION_ARGS);
>  extern Datum pg_stat_get_last_vacuum_time(PG_FUNCTION_ARGS);
> @@ -153,6 +155,38 @@
>  
>  
>  Datum
> +pg_stat_get_live_tuples(PG_FUNCTION_ARGS)
> +{ 
> + Oid relid = PG_GETARG_OID(0);
> + int64   result;
> + PgStat_StatTabEntry *tabentry;
> + 
> + if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
> + result = 0;
> + else
> + result = (int64) (tabentry->n_live_tuples);
> +
> + PG_RETURN_INT64(result);
> +}
> +
> +
> +Datum
> +pg_stat_get_dead_tuples(PG_FUNCTION_ARGS)
> +{
> + Oid relid = PG_GETARG_OID(0);
> + int64   result;
> + PgStat_StatTabEntry *tabentry;
> +
> + if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
> + result = 0;
> + else
> + result = (int64) (tabentry->n_dead_tuples);
> +
> + PG_RETURN_INT64(result);
> +}
> +
> +
> +Datum
>  pg_stat_get_blocks_fetched(PG_FUNCTION_ARGS)
>  {
>   Oid relid = PG_GETARG_OID(0);
> 
> 
> --- ./src/include/catalog/pg_proc.h.old   2006-12-06 10:06:47.0 
> -0800
> +++ ./src/include/catalog/pg_proc.h   2006-12-20 17:09:32.874533832 -0800
> @@ -2872,6 +2872,10 @@
>  DESCR("Statistics: Number of tuples updated");
>  DATA(insert OID = 1933 (  pg_stat_get_tuples_deleted PGNSP PGUID 12 f f t f 
> s 1 20 "26" _null_ _null_ _null_ pg_stat_get_tuples_deleted - _null_ ));
>  DESCR("Statistics: Number of tuples deleted");
> +DATA(insert OID = 2878 (  pg_stat_get_live_tuplesPGNSP PGUID 12 f f t f 
> s 1 20 "26" _null_ _null_ _null_ pg_stat_get_live_tuples - _null_ ));
> +DESCR("Statistics: Number of live tuples");
> +DATA(insert OID = 2879 (  pg_stat_get_dead_tuplesPGNSP PGUID 12 f f t f 
> s 1 20 "26" _null_ _null_ _null_ pg_stat_get_dead_tuples - _null_ ));
> +DESCR("Statistics: Number of dead tuples");
>  DATA(insert OID = 1934 (  pg_stat_get_blocks_fetched PGNSP PGUID 12 f f t f 
> s 1 20 "26" _null_ _null_ _null_ pg_stat_get_blocks_fetched - _null_ ));
>  DESCR("Statistics: Number of blocks fetched");
>  DATA(insert OID = 1935 (  pg_stat_get_blocks_hit PGNSP PGUID 12 
> f f t f s 1 20 "26" _null_ _null_ _null_ pg_stat_get_blocks_hit - _null_ ));
> 
> 
> --- ./src/backend/catalog/system_views.sql.old2006-12-06 
> 10:06:47.0 -0800
> +++ ./src/backend/catalog/system_views.sql2006-12-20 17:13:03.036584344 
> -0800
> @@ -203,10 +203,12 @@
>  pg_stat_get_tuples_returned(C.oid) AS seq_tup_read, 
>  sum(pg_stat_get_numscans(I.indexrelid))::bigint AS idx_scan, 
>  sum(pg_stat_get_tuples_fetched(I.indexrelid))::bigint +
> -pg_stat_get_tuples_fetched(C.oid) AS idx_tup_fetch, 
> +pg_stat_get_tuples_fetched(C.oid) AS idx_tup_fetch, 
>  pg_stat_get_tuples_inserted(C.oid) AS n_tup_ins, 
>  pg_stat_get_tuples_updated(C.oid) AS n_tup_upd, 
>  pg_stat_get_tuples_deleted(C.oid) AS n_tup_del,
> +pg_stat_get_live_tuples(C.oid) AS n_live_tup, 
> +pg_stat_get_dead_tuples(C.oid) AS n_dead_tup,
>  pg_stat_get_last_vacuum_time(C.oid) as last_vacuum,
>  pg_stat_get_last_autovacuum_time(C.oid) as last_autovacuum,
>  pg_stat_get_last_analyze_time(C.oid) as last_analyze,

> 
> ---(end of broadcast)---
> TIP 4: Have you searched our list archives?
> 
>http://archives.postgresql.org

-- 
  Bruce Momjian   [EMAIL PROTECTED]
  EnterpriseDBhttp://www.enterprisedb.com

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

---

Re: [HACKERS] [PATCHES] Patch(es) to expose n_live_tuples and

2006-12-27 Thread Bruce Momjian
Joshua D. Drake wrote:
> 
> > The current terminology of live and dead is already used in many places in 
> > the 
> > documentation and in userspace; mostly around the need for maintainance of 
> > dead tuples within tables, reindex cleaning up dead pages, and even in the 
> > vacuum commands output (n dead tuples cannot be removed yet). Given this 
> > patch came from userland, istm people are comfortable enough with this 
> > terminology there is no need to change it. 
> 
> +1

OK.  I will adjust any places that still use expired, and put the patch
into the queue.

-- 
  Bruce Momjian   [EMAIL PROTECTED]
  EnterpriseDBhttp://www.enterprisedb.com

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

---(end of broadcast)---
TIP 2: Don't 'kill -9' the postmaster


Re: [HACKERS] [PATCHES] Patch(es) to expose n_live_tuples and

2006-12-26 Thread Joshua D. Drake

> The current terminology of live and dead is already used in many places in 
> the 
> documentation and in userspace; mostly around the need for maintainance of 
> dead tuples within tables, reindex cleaning up dead pages, and even in the 
> vacuum commands output (n dead tuples cannot be removed yet). Given this 
> patch came from userland, istm people are comfortable enough with this 
> terminology there is no need to change it. 

+1

> 
-- 

  === The PostgreSQL Company: Command Prompt, Inc. ===
Sales/Support: +1.503.667.4564 || 24x7/Emergency: +1.800.492.2240
Providing the most comprehensive  PostgreSQL solutions since 1997
 http://www.commandprompt.com/

Donate to the PostgreSQL Project: http://www.postgresql.org/about/donate




---(end of broadcast)---
TIP 7: You can help support the PostgreSQL project by donating at

http://www.postgresql.org/about/donate


Re: [HACKERS] [PATCHES] Patch(es) to expose n_live_tuples and

2006-12-26 Thread Robert Treat
On Tuesday 26 December 2006 23:12, Bruce Momjian wrote:
> Tom Lane wrote:
> > Bruce Momjian <[EMAIL PROTECTED]> writes:
> > > Alvaro Herrera wrote:
> > >> I'm not really convinced that Bruce's proposed names seem any better
> > >> to me.  What's wrong with "dead" and "live"?
> > >
> > > In my mind, visible really means "visible to anyone", and expired means
> > > visible to no one.
> >
> > Um ... surely, visibility is in the eye of the beholder (no smiley).
> >
> > I don't have an immediate suggestion for better terminology, but IMHO
> > the whole point of visible/invisible terminology is that it depends on
> > who's looking.  Dead and live seem to convey a more appropriate air
> > of finality.
> >
> > "Expired" is OK as a synonym for "dead", but there is no thesaurus
> > anywhere in the world that will suggest it as an antonym for "visible".
>
> OK, so we need new terminology and we need it to be used consistenly in
> our documentation, whatever we choose.

The current terminology of live and dead is already used in many places in the 
documentation and in userspace; mostly around the need for maintainance of 
dead tuples within tables, reindex cleaning up dead pages, and even in the 
vacuum commands output (n dead tuples cannot be removed yet). Given this 
patch came from userland, istm people are comfortable enough with this 
terminology there is no need to change it. 

-- 
Robert Treat
Build A Brighter LAMP :: Linux Apache {middleware} PostgreSQL

---(end of broadcast)---
TIP 9: In versions below 8.0, the planner will ignore your desire to
   choose an index scan if your joining column's datatypes do not
   match


Re: [HACKERS] [PATCHES] Patch(es) to expose n_live_tuples and

2006-12-26 Thread Bruce Momjian
Tom Lane wrote:
> Bruce Momjian <[EMAIL PROTECTED]> writes:
> > Alvaro Herrera wrote:
> >> I'm not really convinced that Bruce's proposed names seem any better to
> >> me.  What's wrong with "dead" and "live"?
> 
> > In my mind, visible really means "visible to anyone", and expired means
> > visible to no one.
> 
> Um ... surely, visibility is in the eye of the beholder (no smiley).
> 
> I don't have an immediate suggestion for better terminology, but IMHO
> the whole point of visible/invisible terminology is that it depends on
> who's looking.  Dead and live seem to convey a more appropriate air
> of finality.
> 
> "Expired" is OK as a synonym for "dead", but there is no thesaurus
> anywhere in the world that will suggest it as an antonym for "visible".

OK, so we need new terminology and we need it to be used consistenly in
our documentation, whatever we choose.

-- 
  Bruce Momjian   [EMAIL PROTECTED]
  EnterpriseDBhttp://www.enterprisedb.com

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

---(end of broadcast)---
TIP 9: In versions below 8.0, the planner will ignore your desire to
   choose an index scan if your joining column's datatypes do not
   match


Re: [PATCHES] Patch(es) to expose n_live_tuples and

2006-12-26 Thread Tom Lane
Bruce Momjian <[EMAIL PROTECTED]> writes:
> Alvaro Herrera wrote:
>> I'm not really convinced that Bruce's proposed names seem any better to
>> me.  What's wrong with "dead" and "live"?

> In my mind, visible really means "visible to anyone", and expired means
> visible to no one.

Um ... surely, visibility is in the eye of the beholder (no smiley).

I don't have an immediate suggestion for better terminology, but IMHO
the whole point of visible/invisible terminology is that it depends on
who's looking.  Dead and live seem to convey a more appropriate air
of finality.

"Expired" is OK as a synonym for "dead", but there is no thesaurus
anywhere in the world that will suggest it as an antonym for "visible".

regards, tom lane

---(end of broadcast)---
TIP 4: Have you searched our list archives?

   http://archives.postgresql.org


Re: [PATCHES] Patch(es) to expose n_live_tuples and

2006-12-26 Thread Bruce Momjian
Alvaro Herrera wrote:
> Glen Parker wrote:
> 
> [slightly reformatted for sanity]
> 
> > Bruce Momjian wrote:
> > >Is this something we want in 8.3?  I am thinking visible/expired would
> > >be clearer terms.
> >
> > I'd love to see this back patched into 8.2.1 if possible.
> > 
> > Should I resubmit with new names?
> 
> I'm not really convinced that Bruce's proposed names seem any better to
> me.  What's wrong with "dead" and "live"?

With MVCC, my thought has always been that alive/dead is in the eye of
the beholder/backend.  For column names the user will see, I think we
need to use terms that we have used in the past.  If we want to move to
alive/dead, fine, but we then need to make sure we use consistent terms
in the documentation.

In my mind, visible really means "visible to anyone", and expired means
visible to no one.  I don't think live/dead can be as clear as
visible/expired, e.g. saying the tuple is "live to someone" seems
more awkward.

-- 
  Bruce Momjian   [EMAIL PROTECTED]
  EnterpriseDBhttp://www.enterprisedb.com

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

---(end of broadcast)---
TIP 9: In versions below 8.0, the planner will ignore your desire to
   choose an index scan if your joining column's datatypes do not
   match


Re: [PATCHES] Patch(es) to expose n_live_tuples and

2006-12-26 Thread Andrew Dunstan
Glen Parker wrote:
> Alvaro Herrera wrote:
>> As for backpatching, you already knew the answer :-)
>
> Nope, I had no idea this would require initdb...
>
>

Regardless of this, our rule against backpatching new features is well
founded. The stable branches are called stable for a good reason.

cheers

andrew


---(end of broadcast)---
TIP 7: You can help support the PostgreSQL project by donating at

http://www.postgresql.org/about/donate


Re: [PATCHES] Patch(es) to expose n_live_tuples and

2006-12-26 Thread Glen Parker

Alvaro Herrera wrote:

As for backpatching, you already knew the answer :-)


Nope, I had no idea this would require initdb...

-Glen

---(end of broadcast)---
TIP 2: Don't 'kill -9' the postmaster


Re: [PATCHES] Patch(es) to expose n_live_tuples and

2006-12-26 Thread Alvaro Herrera
Glen Parker wrote:

[slightly reformatted for sanity]

> Bruce Momjian wrote:
> >Is this something we want in 8.3?  I am thinking visible/expired would
> >be clearer terms.
>
> I'd love to see this back patched into 8.2.1 if possible.
> 
> Should I resubmit with new names?

I'm not really convinced that Bruce's proposed names seem any better to
me.  What's wrong with "dead" and "live"?

As for backpatching, you already knew the answer :-)

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

---(end of broadcast)---
TIP 5: don't forget to increase your free space map settings


Re: [PATCHES] Patch(es) to expose n_live_tuples and

2006-12-26 Thread Tom Lane
"Joshua D. Drake" <[EMAIL PROTECTED]> writes:
> On Tue, 2006-12-26 at 13:59 -0800, Glen Parker wrote:
>> I'd love to see this back patched into 8.2.1 if possible.

> Probably not. We typically do not introduce new features into back
> releases.

And since this one would require an initdb, there is exactly zero chance
of it being back-patched ...

regards, tom lane

---(end of broadcast)---
TIP 9: In versions below 8.0, the planner will ignore your desire to
   choose an index scan if your joining column's datatypes do not
   match


Re: [PATCHES] Patch(es) to expose n_live_tuples and

2006-12-26 Thread Joshua D. Drake
On Tue, 2006-12-26 at 13:59 -0800, Glen Parker wrote:
> I'd love to see this back patched into 8.2.1 if possible.

Probably not. We typically do not introduce new features into back
releases.

Sincerely,

Joshua D. Drake


> 
> Should I resubmit with new names?
> 
> -Glen
> 
> Bruce Momjian wrote:
> > Is this something we want in 8.3?  I am thinking visible/expired would
> > be clearer terms.
> > 
> > ---
> > 
> > Glen Parker wrote:
> >> This patch consists of two c functions to expose n_live_tuples and
> >> n_dead_tuples, SQL functions to expose them to SQL land, and 
> >> corresponding fields added to pg_stat_all_tables.
> >>
> >> This has been discussed in general.  The purpose is to allow 
> >> autovacuum-esq conditional vacuuming and clustering using SQL to 
> >> discover the required stats.
> 
> 
> ---(end of broadcast)---
> TIP 9: In versions below 8.0, the planner will ignore your desire to
>choose an index scan if your joining column's datatypes do not
>match
> 
-- 

  === The PostgreSQL Company: Command Prompt, Inc. ===
Sales/Support: +1.503.667.4564 || 24x7/Emergency: +1.800.492.2240
Providing the most comprehensive  PostgreSQL solutions since 1997
 http://www.commandprompt.com/

Donate to the PostgreSQL Project: http://www.postgresql.org/about/donate




---(end of broadcast)---
TIP 1: if posting/reading through Usenet, please send an appropriate
   subscribe-nomail command to [EMAIL PROTECTED] so that your
   message can get through to the mailing list cleanly


Re: [PATCHES] Patch(es) to expose n_live_tuples and

2006-12-26 Thread Glen Parker

I'd love to see this back patched into 8.2.1 if possible.

Should I resubmit with new names?

-Glen

Bruce Momjian wrote:

Is this something we want in 8.3?  I am thinking visible/expired would
be clearer terms.

---

Glen Parker wrote:

This patch consists of two c functions to expose n_live_tuples and
n_dead_tuples, SQL functions to expose them to SQL land, and 
corresponding fields added to pg_stat_all_tables.


This has been discussed in general.  The purpose is to allow 
autovacuum-esq conditional vacuuming and clustering using SQL to 
discover the required stats.



---(end of broadcast)---
TIP 9: In versions below 8.0, the planner will ignore your desire to
  choose an index scan if your joining column's datatypes do not
  match


Re: [PATCHES] Patch(es) to expose n_live_tuples and

2006-12-22 Thread Bruce Momjian

Is this something we want in 8.3?  I am thinking visible/expired would
be clearer terms.

---

Glen Parker wrote:
> This patch consists of two c functions to expose n_live_tuples and
> n_dead_tuples, SQL functions to expose them to SQL land, and 
> corresponding fields added to pg_stat_all_tables.
> 
> This has been discussed in general.  The purpose is to allow 
> autovacuum-esq conditional vacuuming and clustering using SQL to 
> discover the required stats.
> 
> -Glen Parker

> --- ./src/backend/utils/adt/pgstatfuncs.c.old 2006-12-20 17:01:30.585852856 
> -0800
> +++ ./src/backend/utils/adt/pgstatfuncs.c 2006-12-20 17:00:58.570719896 
> -0800
> @@ -28,6 +28,8 @@
>  extern Datum pg_stat_get_tuples_inserted(PG_FUNCTION_ARGS);
>  extern Datum pg_stat_get_tuples_updated(PG_FUNCTION_ARGS);
>  extern Datum pg_stat_get_tuples_deleted(PG_FUNCTION_ARGS);
> +extern Datum pg_stat_get_live_tuples(PG_FUNCTION_ARGS);
> +extern Datum pg_stat_get_dead_tuples(PG_FUNCTION_ARGS);
>  extern Datum pg_stat_get_blocks_fetched(PG_FUNCTION_ARGS);
>  extern Datum pg_stat_get_blocks_hit(PG_FUNCTION_ARGS);
>  extern Datum pg_stat_get_last_vacuum_time(PG_FUNCTION_ARGS);
> @@ -153,6 +155,38 @@
>  
>  
>  Datum
> +pg_stat_get_live_tuples(PG_FUNCTION_ARGS)
> +{ 
> + Oid relid = PG_GETARG_OID(0);
> + int64   result;
> + PgStat_StatTabEntry *tabentry;
> + 
> + if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
> + result = 0;
> + else
> + result = (int64) (tabentry->n_live_tuples);
> +
> + PG_RETURN_INT64(result);
> +}
> +
> +
> +Datum
> +pg_stat_get_dead_tuples(PG_FUNCTION_ARGS)
> +{
> + Oid relid = PG_GETARG_OID(0);
> + int64   result;
> + PgStat_StatTabEntry *tabentry;
> +
> + if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
> + result = 0;
> + else
> + result = (int64) (tabentry->n_dead_tuples);
> +
> + PG_RETURN_INT64(result);
> +}
> +
> +
> +Datum
>  pg_stat_get_blocks_fetched(PG_FUNCTION_ARGS)
>  {
>   Oid relid = PG_GETARG_OID(0);
> 
> 
> --- ./src/include/catalog/pg_proc.h.old   2006-12-06 10:06:47.0 
> -0800
> +++ ./src/include/catalog/pg_proc.h   2006-12-20 17:09:32.874533832 -0800
> @@ -2872,6 +2872,10 @@
>  DESCR("Statistics: Number of tuples updated");
>  DATA(insert OID = 1933 (  pg_stat_get_tuples_deleted PGNSP PGUID 12 f f t f 
> s 1 20 "26" _null_ _null_ _null_ pg_stat_get_tuples_deleted - _null_ ));
>  DESCR("Statistics: Number of tuples deleted");
> +DATA(insert OID = 2878 (  pg_stat_get_live_tuplesPGNSP PGUID 12 f f t f 
> s 1 20 "26" _null_ _null_ _null_ pg_stat_get_live_tuples - _null_ ));
> +DESCR("Statistics: Number of live tuples");
> +DATA(insert OID = 2879 (  pg_stat_get_dead_tuplesPGNSP PGUID 12 f f t f 
> s 1 20 "26" _null_ _null_ _null_ pg_stat_get_dead_tuples - _null_ ));
> +DESCR("Statistics: Number of dead tuples");
>  DATA(insert OID = 1934 (  pg_stat_get_blocks_fetched PGNSP PGUID 12 f f t f 
> s 1 20 "26" _null_ _null_ _null_ pg_stat_get_blocks_fetched - _null_ ));
>  DESCR("Statistics: Number of blocks fetched");
>  DATA(insert OID = 1935 (  pg_stat_get_blocks_hit PGNSP PGUID 12 
> f f t f s 1 20 "26" _null_ _null_ _null_ pg_stat_get_blocks_hit - _null_ ));
> 
> 
> --- ./src/backend/catalog/system_views.sql.old2006-12-06 
> 10:06:47.0 -0800
> +++ ./src/backend/catalog/system_views.sql2006-12-20 17:13:03.036584344 
> -0800
> @@ -203,10 +203,12 @@
>  pg_stat_get_tuples_returned(C.oid) AS seq_tup_read, 
>  sum(pg_stat_get_numscans(I.indexrelid))::bigint AS idx_scan, 
>  sum(pg_stat_get_tuples_fetched(I.indexrelid))::bigint +
> -pg_stat_get_tuples_fetched(C.oid) AS idx_tup_fetch, 
> +pg_stat_get_tuples_fetched(C.oid) AS idx_tup_fetch, 
>  pg_stat_get_tuples_inserted(C.oid) AS n_tup_ins, 
>  pg_stat_get_tuples_updated(C.oid) AS n_tup_upd, 
>  pg_stat_get_tuples_deleted(C.oid) AS n_tup_del,
> +pg_stat_get_live_tuples(C.oid) AS n_live_tup, 
> +pg_stat_get_dead_tuples(C.oid) AS n_dead_tup,
>  pg_stat_get_last_vacuum_time(C.oid) as last_vacuum,
>  pg_stat_get_last_autovacuum_time(C.oid) as last_autovacuum,
>  pg_stat_get_last_analyze_time(C.oid) as last_analyze,

> 
> ---(end of broadcast)---
> TIP 4: Have you searched our list archives?
> 
>http://archives.postgresql.org

-- 
  Bruce Momjian   [EMAIL PROTECTED]
  EnterpriseDBhttp://www.enterprisedb.com

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

---(end of broadcast)---
TIP 7: You can help support the PostgreSQL project by donating at

   

[PATCHES] Patch(es) to expose n_live_tuples and n_dead_tuples to SQL land

2006-12-20 Thread Glen Parker

This patch consists of two c functions to expose n_live_tuples and
n_dead_tuples, SQL functions to expose them to SQL land, and 
corresponding fields added to pg_stat_all_tables.


This has been discussed in general.  The purpose is to allow 
autovacuum-esq conditional vacuuming and clustering using SQL to 
discover the required stats.


-Glen Parker
--- ./src/backend/utils/adt/pgstatfuncs.c.old   2006-12-20 17:01:30.585852856 
-0800
+++ ./src/backend/utils/adt/pgstatfuncs.c   2006-12-20 17:00:58.570719896 
-0800
@@ -28,6 +28,8 @@
 extern Datum pg_stat_get_tuples_inserted(PG_FUNCTION_ARGS);
 extern Datum pg_stat_get_tuples_updated(PG_FUNCTION_ARGS);
 extern Datum pg_stat_get_tuples_deleted(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_live_tuples(PG_FUNCTION_ARGS);
+extern Datum pg_stat_get_dead_tuples(PG_FUNCTION_ARGS);
 extern Datum pg_stat_get_blocks_fetched(PG_FUNCTION_ARGS);
 extern Datum pg_stat_get_blocks_hit(PG_FUNCTION_ARGS);
 extern Datum pg_stat_get_last_vacuum_time(PG_FUNCTION_ARGS);
@@ -153,6 +155,38 @@
 
 
 Datum
+pg_stat_get_live_tuples(PG_FUNCTION_ARGS)
+{ 
+   Oid relid = PG_GETARG_OID(0);
+   int64   result;
+   PgStat_StatTabEntry *tabentry;
+ 
+   if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+   result = 0;
+   else
+   result = (int64) (tabentry->n_live_tuples);
+
+   PG_RETURN_INT64(result);
+}
+
+
+Datum
+pg_stat_get_dead_tuples(PG_FUNCTION_ARGS)
+{
+   Oid relid = PG_GETARG_OID(0);
+   int64   result;
+   PgStat_StatTabEntry *tabentry;
+
+   if ((tabentry = pgstat_fetch_stat_tabentry(relid)) == NULL)
+   result = 0;
+   else
+   result = (int64) (tabentry->n_dead_tuples);
+
+   PG_RETURN_INT64(result);
+}
+
+
+Datum
 pg_stat_get_blocks_fetched(PG_FUNCTION_ARGS)
 {
Oid relid = PG_GETARG_OID(0);


--- ./src/include/catalog/pg_proc.h.old 2006-12-06 10:06:47.0 -0800
+++ ./src/include/catalog/pg_proc.h 2006-12-20 17:09:32.874533832 -0800
@@ -2872,6 +2872,10 @@
 DESCR("Statistics: Number of tuples updated");
 DATA(insert OID = 1933 (  pg_stat_get_tuples_deleted   PGNSP PGUID 12 f f t f 
s 1 20 "26" _null_ _null_ _null_ pg_stat_get_tuples_deleted - _null_ ));
 DESCR("Statistics: Number of tuples deleted");
+DATA(insert OID = 2878 (  pg_stat_get_live_tuples  PGNSP PGUID 12 f f t f 
s 1 20 "26" _null_ _null_ _null_ pg_stat_get_live_tuples - _null_ ));
+DESCR("Statistics: Number of live tuples");
+DATA(insert OID = 2879 (  pg_stat_get_dead_tuples  PGNSP PGUID 12 f f t f 
s 1 20 "26" _null_ _null_ _null_ pg_stat_get_dead_tuples - _null_ ));
+DESCR("Statistics: Number of dead tuples");
 DATA(insert OID = 1934 (  pg_stat_get_blocks_fetched   PGNSP PGUID 12 f f t f 
s 1 20 "26" _null_ _null_ _null_ pg_stat_get_blocks_fetched - _null_ ));
 DESCR("Statistics: Number of blocks fetched");
 DATA(insert OID = 1935 (  pg_stat_get_blocks_hit   PGNSP PGUID 12 
f f t f s 1 20 "26" _null_ _null_ _null_ pg_stat_get_blocks_hit - _null_ ));


--- ./src/backend/catalog/system_views.sql.old  2006-12-06 10:06:47.0 
-0800
+++ ./src/backend/catalog/system_views.sql  2006-12-20 17:13:03.036584344 
-0800
@@ -203,10 +203,12 @@
 pg_stat_get_tuples_returned(C.oid) AS seq_tup_read, 
 sum(pg_stat_get_numscans(I.indexrelid))::bigint AS idx_scan, 
 sum(pg_stat_get_tuples_fetched(I.indexrelid))::bigint +
-pg_stat_get_tuples_fetched(C.oid) AS idx_tup_fetch, 
+pg_stat_get_tuples_fetched(C.oid) AS idx_tup_fetch, 
 pg_stat_get_tuples_inserted(C.oid) AS n_tup_ins, 
 pg_stat_get_tuples_updated(C.oid) AS n_tup_upd, 
 pg_stat_get_tuples_deleted(C.oid) AS n_tup_del,
+pg_stat_get_live_tuples(C.oid) AS n_live_tup, 
+pg_stat_get_dead_tuples(C.oid) AS n_dead_tup,
 pg_stat_get_last_vacuum_time(C.oid) as last_vacuum,
 pg_stat_get_last_autovacuum_time(C.oid) as last_autovacuum,
 pg_stat_get_last_analyze_time(C.oid) as last_analyze,

---(end of broadcast)---
TIP 4: Have you searched our list archives?

   http://archives.postgresql.org