OSDN Git Service

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 e51f408..33c661d 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 c2a1ed5..0e9e7b6 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 05f669c..00b5412 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 67374a4..11e6d3d 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;
@@ -967,6 +969,15 @@ static struct config_int ConfigureNamesInt[] =
        },
 
        {
+               {"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."),
                        NULL
@@ -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 070d1e7..b68cd2f 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 4255d62..a858f40 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 9268335..b8bf0f9 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 c3473e2..3336607 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;