of the local buffer arena for temporary table access.
<!--
-$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">
</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>
*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
#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"
static HTAB *LocalBufHash = NULL;
+static void InitLocalBuffers(void);
+
+
/*
* LocalBufferAlloc -
* Find or create a local buffer for the given page of the given relation.
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);
}
/*
- * 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,
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;
}
*
*
* 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 $
*
*
*-------------------------------------------------------------------------
/* Do local initialization of storage and buffer managers */
smgrinit();
InitBufferPoolAccess();
- InitLocalBuffer();
}
* 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 $
*
*--------------------------------------------------------------------
*/
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);
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;
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."),
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)
{
# - 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
*
* 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 $
*/
/*----------------------------------------------------------------------
"superuser_reserved_connections",
"syslog_facility",
"syslog_ident",
+ "temp_buffers",
"TimeZone",
"trace_notify",
"transform_null_equals",
* 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 $
*
*-------------------------------------------------------------------------
*/
extern void BufferSync(void);
extern void BgBufferSync(void);
-extern void InitLocalBuffer(void);
extern void AtProcExit_LocalBuffers(void);
/* in freelist.c */
* 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
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;