]> granicus.if.org Git - postgresql/commitdiff
Remove some unused and seldom used fields from RelationAmInfo.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Tue, 16 Apr 2013 12:01:21 +0000 (15:01 +0300)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Tue, 16 Apr 2013 12:07:58 +0000 (15:07 +0300)
This saves some memory from each index relcache entry. At least on a 64-bit
machine, it saves just enough to shrink a typical relcache entry's memory
usage from 2k to 1k. That's nice if you have a lot of backends and a lot of
indexes.

src/backend/access/index/indexam.c
src/include/utils/rel.h

index ce94649281d93a69e2d733f78b75166cdbdcb969..b87815544d9eec6131447c718ccd8648eae1b90f 100644 (file)
@@ -114,6 +114,13 @@ do { \
        } \
 } while(0)
 
+#define GET_UNCACHED_REL_PROCEDURE(pname) \
+do { \
+       if (!RegProcedureIsValid(indexRelation->rd_am->pname)) \
+               elog(ERROR, "invalid %s regproc", CppAsString(pname)); \
+       fmgr_info(indexRelation->rd_am->pname, &procedure); \
+} while(0)
+
 #define GET_SCAN_PROCEDURE(pname) \
 do { \
        procedure = &scan->indexRelation->rd_aminfo->pname; \
@@ -671,14 +678,14 @@ index_bulk_delete(IndexVacuumInfo *info,
                                  void *callback_state)
 {
        Relation        indexRelation = info->index;
-       FmgrInfo   *procedure;
+       FmgrInfo        procedure;
        IndexBulkDeleteResult *result;
 
        RELATION_CHECKS;
-       GET_REL_PROCEDURE(ambulkdelete);
+       GET_UNCACHED_REL_PROCEDURE(ambulkdelete);
 
        result = (IndexBulkDeleteResult *)
-               DatumGetPointer(FunctionCall4(procedure,
+               DatumGetPointer(FunctionCall4(&procedure,
                                                                          PointerGetDatum(info),
                                                                          PointerGetDatum(stats),
                                                                          PointerGetDatum((Pointer) callback),
@@ -698,14 +705,14 @@ index_vacuum_cleanup(IndexVacuumInfo *info,
                                         IndexBulkDeleteResult *stats)
 {
        Relation        indexRelation = info->index;
-       FmgrInfo   *procedure;
+       FmgrInfo        procedure;
        IndexBulkDeleteResult *result;
 
        RELATION_CHECKS;
-       GET_REL_PROCEDURE(amvacuumcleanup);
+       GET_UNCACHED_REL_PROCEDURE(amvacuumcleanup);
 
        result = (IndexBulkDeleteResult *)
-               DatumGetPointer(FunctionCall2(procedure,
+               DatumGetPointer(FunctionCall2(&procedure,
                                                                          PointerGetDatum(info),
                                                                          PointerGetDatum(stats)));
 
index 1fd3f67b1e4861dff57c94ef4d7a0707cecb8612..632743af9436e14f8b537e58d2fc0acbbb319873 100644 (file)
@@ -47,8 +47,8 @@ typedef LockInfoData *LockInfo;
 
 
 /*
- * Cached lookup information for the index access method functions defined
- * by the pg_am row associated with an index relation.
+ * Cached lookup information for the frequently used index access method
+ * functions, defined by the pg_am row associated with an index relation.
  */
 typedef struct RelationAmInfo
 {
@@ -60,13 +60,7 @@ typedef struct RelationAmInfo
        FmgrInfo        amendscan;
        FmgrInfo        ammarkpos;
        FmgrInfo        amrestrpos;
-       FmgrInfo        ambuild;
-       FmgrInfo        ambuildempty;
-       FmgrInfo        ambulkdelete;
-       FmgrInfo        amvacuumcleanup;
        FmgrInfo        amcanreturn;
-       FmgrInfo        amcostestimate;
-       FmgrInfo        amoptions;
 } RelationAmInfo;