From d2fe7e85aea31cfe8cd6559a060f71c424fe03af Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=A9dric=20Villemain?= <cedric@2ndquadrant.fr>
Date: Wed, 25 May 2011 23:17:36 +0200
Subject: [PATCH 1/7] Add reloscache column to pg_class

1 column reloscache to contain the percentage of pages in cache per relation.
May be used by the planner and updated with ANALYZE OSCACHE; (not done yet,
see next commits)
---
 doc/src/sgml/catalogs.sgml         |   11 +++++++++
 src/backend/catalog/heap.c         |    1 +
 src/backend/utils/cache/relcache.c |    2 +
 src/include/catalog/pg_class.h     |   44 ++++++++++++++++++-----------------
 4 files changed, 37 insertions(+), 21 deletions(-)

diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
new file mode 100644
index 8504555..4cfad39
*** a/doc/src/sgml/catalogs.sgml
--- b/doc/src/sgml/catalogs.sgml
***************
*** 1634,1639 ****
--- 1634,1650 ----
       </row>
  
       <row>
+       <entry><structfield>reloscache</structfield></entry>
+       <entry><type>float4</type></entry>
+       <entry></entry>
+       <entry>
+        Percentage of the files in OS cache.  This is only an estimate used by
+        the planner.  It is updated by <command>ANALYZE OSCACHE</command>.
+        By default, the value is not updated and an extension is required.
+       </entry>
+      </row>
+ 
+      <row>
        <entry><structfield>reltoastrelid</structfield></entry>
        <entry><type>oid</type></entry>
        <entry><literal><link linkend="catalog-pg-class"><structname>pg_class</structname></link>.oid</literal></entry>
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
new file mode 100644
index a6e541d..2043c40
*** a/src/backend/catalog/heap.c
--- b/src/backend/catalog/heap.c
*************** InsertPgClassTuple(Relation pg_class_des
*** 764,769 ****
--- 764,770 ----
  	values[Anum_pg_class_reltablespace - 1] = ObjectIdGetDatum(rd_rel->reltablespace);
  	values[Anum_pg_class_relpages - 1] = Int32GetDatum(rd_rel->relpages);
  	values[Anum_pg_class_reltuples - 1] = Float4GetDatum(rd_rel->reltuples);
+ 	values[Anum_pg_class_reloscache - 1] = Float4GetDatum(rd_rel->reloscache);
  	values[Anum_pg_class_reltoastrelid - 1] = ObjectIdGetDatum(rd_rel->reltoastrelid);
  	values[Anum_pg_class_reltoastidxid - 1] = ObjectIdGetDatum(rd_rel->reltoastidxid);
  	values[Anum_pg_class_relhasindex - 1] = BoolGetDatum(rd_rel->relhasindex);
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
new file mode 100644
index d7e94ff..ca09e3b
*** a/src/backend/utils/cache/relcache.c
--- b/src/backend/utils/cache/relcache.c
*************** formrdesc(const char *relationName, Oid
*** 1417,1422 ****
--- 1417,1423 ----
  
  	relation->rd_rel->relpages = 1;
  	relation->rd_rel->reltuples = 1;
+ 	relation->rd_rel->reloscache = 0;
  	relation->rd_rel->relkind = RELKIND_RELATION;
  	relation->rd_rel->relhasoids = hasoids;
  	relation->rd_rel->relnatts = (int16) natts;
*************** RelationSetNewRelfilenode(Relation relat
*** 2661,2666 ****
--- 2662,2668 ----
  	{
  		classform->relpages = 0;	/* it's empty until further notice */
  		classform->reltuples = 0;
+ 		classform->reloscache = 0;
  	}
  	classform->relfrozenxid = freezeXid;
  
diff --git a/src/include/catalog/pg_class.h b/src/include/catalog/pg_class.h
new file mode 100644
index ffcce3c..93218ad
*** a/src/include/catalog/pg_class.h
--- b/src/include/catalog/pg_class.h
*************** CATALOG(pg_class,1259) BKI_BOOTSTRAP BKI
*** 45,50 ****
--- 45,51 ----
  	Oid			reltablespace;	/* identifier of table space for relation */
  	int4		relpages;		/* # of blocks (not always up-to-date) */
  	float4		reltuples;		/* # of tuples (not always up-to-date) */
+ 	float4		reloscache;		/* % of files in OS cache (not always up-to-date) */
  	Oid			reltoastrelid;	/* OID of toast table; 0 if none */
  	Oid			reltoastidxid;	/* if toast table, OID of chunk_id index */
  	bool		relhasindex;	/* T if has (or has had) any indexes */
*************** typedef FormData_pg_class *Form_pg_class
*** 92,98 ****
   * ----------------
   */
  
! #define Natts_pg_class					26
  #define Anum_pg_class_relname			1
  #define Anum_pg_class_relnamespace		2
  #define Anum_pg_class_reltype			3
--- 93,99 ----
   * ----------------
   */
  
! #define Natts_pg_class					27
  #define Anum_pg_class_relname			1
  #define Anum_pg_class_relnamespace		2
  #define Anum_pg_class_reltype			3
*************** typedef FormData_pg_class *Form_pg_class
*** 103,124 ****
  #define Anum_pg_class_reltablespace		8
  #define Anum_pg_class_relpages			9
  #define Anum_pg_class_reltuples			10
! #define Anum_pg_class_reltoastrelid		11
! #define Anum_pg_class_reltoastidxid		12
! #define Anum_pg_class_relhasindex		13
! #define Anum_pg_class_relisshared		14
! #define Anum_pg_class_relpersistence	15
! #define Anum_pg_class_relkind			16
! #define Anum_pg_class_relnatts			17
! #define Anum_pg_class_relchecks			18
! #define Anum_pg_class_relhasoids		19
! #define Anum_pg_class_relhaspkey		20
! #define Anum_pg_class_relhasrules		21
! #define Anum_pg_class_relhastriggers	22
! #define Anum_pg_class_relhassubclass	23
! #define Anum_pg_class_relfrozenxid		24
! #define Anum_pg_class_relacl			25
! #define Anum_pg_class_reloptions		26
  
  /* ----------------
   *		initial contents of pg_class
--- 104,126 ----
  #define Anum_pg_class_reltablespace		8
  #define Anum_pg_class_relpages			9
  #define Anum_pg_class_reltuples			10
! #define Anum_pg_class_reloscache		11
! #define Anum_pg_class_reltoastrelid		12
! #define Anum_pg_class_reltoastidxid		13
! #define Anum_pg_class_relhasindex		14
! #define Anum_pg_class_relisshared		15
! #define Anum_pg_class_relpersistence	16
! #define Anum_pg_class_relkind			17
! #define Anum_pg_class_relnatts			18
! #define Anum_pg_class_relchecks			19
! #define Anum_pg_class_relhasoids		20
! #define Anum_pg_class_relhaspkey		21
! #define Anum_pg_class_relhasrules		22
! #define Anum_pg_class_relhastriggers	23
! #define Anum_pg_class_relhassubclass	24
! #define Anum_pg_class_relfrozenxid		25
! #define Anum_pg_class_relacl			26
! #define Anum_pg_class_reloptions		27
  
  /* ----------------
   *		initial contents of pg_class
*************** typedef FormData_pg_class *Form_pg_class
*** 130,142 ****
   */
  
  /* Note: "3" in the relfrozenxid column stands for FirstNormalTransactionId */
! DATA(insert OID = 1247 (  pg_type		PGNSP 71 0 PGUID 0 0 0 0 0 0 0 f f p r 29 0 t f f f f 3 _null_ _null_ ));
  DESCR("");
! DATA(insert OID = 1249 (  pg_attribute	PGNSP 75 0 PGUID 0 0 0 0 0 0 0 f f p r 20 0 f f f f f 3 _null_ _null_ ));
  DESCR("");
! DATA(insert OID = 1255 (  pg_proc		PGNSP 81 0 PGUID 0 0 0 0 0 0 0 f f p r 25 0 t f f f f 3 _null_ _null_ ));
  DESCR("");
! DATA(insert OID = 1259 (  pg_class		PGNSP 83 0 PGUID 0 0 0 0 0 0 0 f f p r 26 0 t f f f f 3 _null_ _null_ ));
  DESCR("");
  
  
--- 132,144 ----
   */
  
  /* Note: "3" in the relfrozenxid column stands for FirstNormalTransactionId */
! DATA(insert OID = 1247 (  pg_type		PGNSP 71 0 PGUID 0 0 0 0 0 0 0 0 f f p r 29 0 t f f f f 3 _null_ _null_ ));
  DESCR("");
! DATA(insert OID = 1249 (  pg_attribute	PGNSP 75 0 PGUID 0 0 0 0 0 0 0 0 f f p r 20 0 f f f f f 3 _null_ _null_ ));
  DESCR("");
! DATA(insert OID = 1255 (  pg_proc		PGNSP 81 0 PGUID 0 0 0 0 0 0 0 0 f f p r 25 0 t f f f f 3 _null_ _null_ ));
  DESCR("");
! DATA(insert OID = 1259 (  pg_class		PGNSP 83 0 PGUID 0 0 0 0 0 0 0 0 f f p r 27 0 t f f f f 3 _null_ _null_ ));
  DESCR("");
  
  
-- 
1.7.5.3

