Add temp_buffers GUC variable to allow users to determine the size
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 19 Mar 2005 23:27:11 +0000 (23:27 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 19 Mar 2005 23:27:11 +0000 (23:27 +0000)
of the local buffer arena for temporary table access.

doc/src/sgml/runtime.sgml
src/backend/storage/buffer/localbuf.c
src/backend/utils/init/postinit.c
src/backend/utils/misc/guc.c
src/backend/utils/misc/postgresql.conf.sample
src/bin/psql/tab-complete.c
src/include/storage/bufmgr.h
src/include/utils/guc.h

index e51f4085cff40ea0f800e2f3c50daaed42e3157b..33c661dd5cb0b00998a70890f1f8bcb60056a915 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-$PostgreSQL: pgsql/doc/src/sgml/runtime.sgml,v 1.309 2005/03/14 06:49:48 neilc Exp $
+$PostgreSQL: pgsql/doc/src/sgml/runtime.sgml,v 1.310 2005/03/19 23:27:04 tgl Exp $
 -->
 
 <chapter Id="runtime">
@@ -1038,6 +1038,33 @@ SET ENABLE_SEQSCAN TO OFF;
       </listitem>
      </varlistentry>
 
+     <varlistentry id="guc-temp-buffers" xreflabel="temp_buffers">
+      <term><varname>temp_buffers</varname> (<type>integer</type>)</term>
+      <indexterm>
+       <primary><varname>temp_buffers</> configuration parameter</primary>
+      </indexterm>
+      <listitem>
+       <para>
+        Sets the maximum number of temporary buffers used by each database
+        session.  These are session-local buffers used only for access
+        to temporary tables.  The default is 1000.  The setting can
+        be changed within individual sessions, but only up until the
+        first use of temporary tables within a session; subsequent
+        attempts to change the value will have no effect on that session.
+       </para>
+
+       <para>
+        A session will allocate temporary buffers as needed up to the limit
+        given by <varname>temp_buffers</>.  The cost of setting a large
+        value in sessions that do not actually need a lot of temporary
+        buffers is only a buffer descriptor, or about 64 bytes, per
+        increment in <varname>temp_buffers</>.  However if a buffer is
+        actually used an additional 8192 bytes will be consumed for it
+        (or in general <symbol>BLCKSZ</symbol> bytes).
+       </para>
+      </listitem>
+     </varlistentry>
+
      <varlistentry id="guc-work-mem" xreflabel="work_mem">
       <term><varname>work_mem</varname> (<type>integer</type>)</term>
       <indexterm>
index c2a1ed587e1b00b04285d0a3937f9900cd83e157..0e9e7b68cc3366fa55741f7cfcbac098a09a0804 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/storage/buffer/localbuf.c,v 1.65 2005/03/19 17:39:43 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/storage/buffer/localbuf.c,v 1.66 2005/03/19 23:27:05 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -18,6 +18,7 @@
 #include "storage/buf_internals.h"
 #include "storage/bufmgr.h"
 #include "storage/smgr.h"
+#include "utils/guc.h"
 #include "utils/memutils.h"
 #include "utils/resowner.h"
 
@@ -46,6 +47,9 @@ static int    nextFreeLocalBuf = 0;
 static HTAB *LocalBufHash = NULL;
 
 
+static void InitLocalBuffers(void);
+
+
 /*
  * LocalBufferAlloc -
  *   Find or create a local buffer for the given page of the given relation.
@@ -66,6 +70,10 @@ LocalBufferAlloc(Relation reln, BlockNumber blockNum, bool *foundPtr)
 
    INIT_BUFFERTAG(newTag, reln, blockNum);
 
+   /* Initialize local buffers if first request in this session */
+   if (LocalBufHash == NULL)
+       InitLocalBuffers();
+
    /* See if the desired buffer already exists */
    hresult = (LocalBufferLookupEnt *)
        hash_search(LocalBufHash, (void *) &newTag, HASH_FIND, NULL);
@@ -238,32 +246,18 @@ WriteLocalBuffer(Buffer buffer, bool release)
 }
 
 /*
- * InitLocalBuffer -
+ * InitLocalBuffers -
  *   init the local buffer cache. Since most queries (esp. multi-user ones)
  *   don't involve local buffers, we delay allocating actual memory for the
  *   buffers until we need them; just make the buffer headers here.
  */
-void
-InitLocalBuffer(void)
+static void
+InitLocalBuffers(void)
 {
-   int         nbufs = 64;     /* should be from a GUC var */
+   int         nbufs = num_temp_buffers;
    HASHCTL     info;
    int         i;
 
-   /* Create the lookup hash table */
-   MemSet(&info, 0, sizeof(info));
-   info.keysize = sizeof(BufferTag);
-   info.entrysize = sizeof(LocalBufferLookupEnt);
-   info.hash = tag_hash;
-
-   LocalBufHash = hash_create("Local Buffer Lookup Table",
-                              nbufs,
-                              &info,
-                              HASH_ELEM | HASH_FUNCTION);
-
-   if (!LocalBufHash)
-       elog(ERROR, "could not initialize local buffer hash table");
-
    /* Allocate and zero buffer headers and auxiliary arrays */
    LocalBufferDescriptors = (BufferDesc *)
        MemoryContextAllocZero(TopMemoryContext,
@@ -291,6 +285,20 @@ InitLocalBuffer(void)
        buf->buf_id = -i - 2;
    }
 
+   /* Create the lookup hash table */
+   MemSet(&info, 0, sizeof(info));
+   info.keysize = sizeof(BufferTag);
+   info.entrysize = sizeof(LocalBufferLookupEnt);
+   info.hash = tag_hash;
+
+   LocalBufHash = hash_create("Local Buffer Lookup Table",
+                              nbufs,
+                              &info,
+                              HASH_ELEM | HASH_FUNCTION);
+
+   if (!LocalBufHash)
+       elog(ERROR, "could not initialize local buffer hash table");
+
    /* Initialization done, mark buffers allocated */
    NLocBuffer = nbufs;
 }
index 05f669c2ccdabaf70a4efdb80bab993063398289..00b541204b4b6cc615b4761d6c214ed54c982166 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/utils/init/postinit.c,v 1.143 2005/03/18 16:16:09 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/utils/init/postinit.c,v 1.144 2005/03/19 23:27:06 tgl Exp $
  *
  *
  *-------------------------------------------------------------------------
@@ -257,7 +257,6 @@ BaseInit(void)
    /* Do local initialization of storage and buffer managers */
    smgrinit();
    InitBufferPoolAccess();
-   InitLocalBuffer();
 }
 
 
index 67374a4b61f1c0d68be0d6a4ea7181b58c322e98..11e6d3de58dd2b8be4c6b06c418f79c424ffa572 100644 (file)
@@ -10,7 +10,7 @@
  * Written by Peter Eisentraut <peter_e@gmx.net>.
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.255 2005/03/13 09:36:31 neilc Exp $
+ *   $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.256 2005/03/19 23:27:07 tgl Exp $
  *
  *--------------------------------------------------------------------
  */
@@ -104,6 +104,7 @@ static const char *assign_log_error_verbosity(const char *newval, bool doit,
                           GucSource source);
 static const char *assign_log_statement(const char *newval, bool doit,
                     GucSource source);
+static const char *show_num_temp_buffers(void);
 static bool assign_phony_autocommit(bool newval, bool doit, GucSource source);
 static const char *assign_custom_variable_classes(const char *newval, bool doit,
                               GucSource source);
@@ -144,9 +145,10 @@ bool       default_with_oids = false;
 int            log_min_error_statement = PANIC;
 int            log_min_messages = NOTICE;
 int            client_min_messages = NOTICE;
-
 int            log_min_duration_statement = -1;
 
+int            num_temp_buffers = 1000;
+
 char      *ConfigFileName;
 char      *HbaFileName;
 char      *IdentFileName;
@@ -966,6 +968,15 @@ static struct config_int ConfigureNamesInt[] =
        1000, 16, INT_MAX / BLCKSZ, NULL, NULL
    },
 
+   {
+       {"temp_buffers", PGC_USERSET, RESOURCES_MEM,
+           gettext_noop("Sets the maximum number of temporary buffers used by each session."),
+           NULL
+       },
+       &num_temp_buffers,
+       1000, 100, INT_MAX / BLCKSZ, NULL, show_num_temp_buffers
+   },
+
    {
        {"port", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
            gettext_noop("Sets the TCP port the server listens on."),
@@ -5496,6 +5507,19 @@ assign_log_statement(const char *newval, bool doit, GucSource source)
    return newval;              /* OK */
 }
 
+static const char *
+show_num_temp_buffers(void)
+{
+   /*
+    * We show the GUC var until local buffers have been initialized,
+    * and NLocBuffer afterwards.
+    */
+   static char nbuf[32];
+
+   sprintf(nbuf, "%d", NLocBuffer ? NLocBuffer : num_temp_buffers);
+   return nbuf;
+}
+
 static bool
 assign_phony_autocommit(bool newval, bool doit, GucSource source)
 {
index 070d1e7632eecfd2242293f55b7f09fc80232d71..b68cd2f8cf9797f9e736f33c015c7a937c2e03e6 100644 (file)
@@ -74,6 +74,7 @@
 # - Memory -
 
 #shared_buffers = 1000     # min 16, at least max_connections*2, 8KB each
+#temp_buffers = 1000       # min 100, 8KB each
 #work_mem = 1024       # min 64, size in KB
 #maintenance_work_mem = 16384  # min 1024, size in KB
 #max_stack_depth = 2048        # min 100, size in KB
index 4255d62ac94723abd701073456eac7f05b4c001b..a858f4094024d347124ceced01510c31e880b381 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 2000-2005, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/tab-complete.c,v 1.121 2005/01/23 15:58:50 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/tab-complete.c,v 1.122 2005/03/19 23:27:08 tgl Exp $
  */
 
 /*----------------------------------------------------------------------
@@ -594,6 +594,7 @@ psql_completion(char *text, int start, int end)
        "superuser_reserved_connections",
        "syslog_facility",
        "syslog_ident",
+       "temp_buffers",
        "TimeZone",
        "trace_notify",
        "transform_null_equals",
index 9268335b02689c47aa6fa54061cb96249a6af49d..b8bf0f978a72748c2057ec46a42c8b4875238534 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/storage/bufmgr.h,v 1.91 2005/03/18 16:16:09 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/storage/bufmgr.h,v 1.92 2005/03/19 23:27:10 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -157,7 +157,6 @@ extern void BufmgrCommit(void);
 extern void    BufferSync(void);
 extern void BgBufferSync(void);
 
-extern void InitLocalBuffer(void);
 extern void AtProcExit_LocalBuffers(void);
 
 /* in freelist.c */
index c3473e2fc31814cc3c90d1ba690c3d334a935a26..33366078c825ed6a298ebb9ccb85d976d2ae1533 100644 (file)
@@ -7,7 +7,7 @@
  * Copyright (c) 2000-2005, PostgreSQL Global Development Group
  * Written by Peter Eisentraut <peter_e@gmx.net>.
  *
- * $PostgreSQL: pgsql/src/include/utils/guc.h,v 1.58 2005/01/01 05:43:09 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/utils/guc.h,v 1.59 2005/03/19 23:27:11 tgl Exp $
  *--------------------------------------------------------------------
  */
 #ifndef GUC_H
@@ -126,6 +126,8 @@ extern int  log_min_messages;
 extern int client_min_messages;
 extern int log_min_duration_statement;
 
+extern int num_temp_buffers;
+
 extern char *ConfigFileName;
 extern char *HbaFileName;
 extern char *IdentFileName;