Add temp_buffers GUC variable to allow users to determine the size
of the local buffer arena for temporary table access.
This commit is contained in:
parent
d65522aeb6
commit
91728fa26c
@ -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">
|
<chapter Id="runtime">
|
||||||
@ -1038,6 +1038,33 @@ SET ENABLE_SEQSCAN TO OFF;
|
|||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</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">
|
<varlistentry id="guc-work-mem" xreflabel="work_mem">
|
||||||
<term><varname>work_mem</varname> (<type>integer</type>)</term>
|
<term><varname>work_mem</varname> (<type>integer</type>)</term>
|
||||||
<indexterm>
|
<indexterm>
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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/buf_internals.h"
|
||||||
#include "storage/bufmgr.h"
|
#include "storage/bufmgr.h"
|
||||||
#include "storage/smgr.h"
|
#include "storage/smgr.h"
|
||||||
|
#include "utils/guc.h"
|
||||||
#include "utils/memutils.h"
|
#include "utils/memutils.h"
|
||||||
#include "utils/resowner.h"
|
#include "utils/resowner.h"
|
||||||
|
|
||||||
@ -46,6 +47,9 @@ static int nextFreeLocalBuf = 0;
|
|||||||
static HTAB *LocalBufHash = NULL;
|
static HTAB *LocalBufHash = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
static void InitLocalBuffers(void);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* LocalBufferAlloc -
|
* LocalBufferAlloc -
|
||||||
* Find or create a local buffer for the given page of the given relation.
|
* 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);
|
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 */
|
/* See if the desired buffer already exists */
|
||||||
hresult = (LocalBufferLookupEnt *)
|
hresult = (LocalBufferLookupEnt *)
|
||||||
hash_search(LocalBufHash, (void *) &newTag, HASH_FIND, NULL);
|
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)
|
* init the local buffer cache. Since most queries (esp. multi-user ones)
|
||||||
* don't involve local buffers, we delay allocating actual memory for the
|
* don't involve local buffers, we delay allocating actual memory for the
|
||||||
* buffers until we need them; just make the buffer headers here.
|
* buffers until we need them; just make the buffer headers here.
|
||||||
*/
|
*/
|
||||||
void
|
static void
|
||||||
InitLocalBuffer(void)
|
InitLocalBuffers(void)
|
||||||
{
|
{
|
||||||
int nbufs = 64; /* should be from a GUC var */
|
int nbufs = num_temp_buffers;
|
||||||
HASHCTL info;
|
HASHCTL info;
|
||||||
int i;
|
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 */
|
/* Allocate and zero buffer headers and auxiliary arrays */
|
||||||
LocalBufferDescriptors = (BufferDesc *)
|
LocalBufferDescriptors = (BufferDesc *)
|
||||||
MemoryContextAllocZero(TopMemoryContext,
|
MemoryContextAllocZero(TopMemoryContext,
|
||||||
@ -291,6 +285,20 @@ InitLocalBuffer(void)
|
|||||||
buf->buf_id = -i - 2;
|
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 */
|
/* Initialization done, mark buffers allocated */
|
||||||
NLocBuffer = nbufs;
|
NLocBuffer = nbufs;
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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 */
|
/* Do local initialization of storage and buffer managers */
|
||||||
smgrinit();
|
smgrinit();
|
||||||
InitBufferPoolAccess();
|
InitBufferPoolAccess();
|
||||||
InitLocalBuffer();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
* Written by Peter Eisentraut <peter_e@gmx.net>.
|
* Written by Peter Eisentraut <peter_e@gmx.net>.
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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);
|
GucSource source);
|
||||||
static const char *assign_log_statement(const char *newval, bool doit,
|
static const char *assign_log_statement(const char *newval, bool doit,
|
||||||
GucSource source);
|
GucSource source);
|
||||||
|
static const char *show_num_temp_buffers(void);
|
||||||
static bool assign_phony_autocommit(bool newval, bool doit, GucSource source);
|
static bool assign_phony_autocommit(bool newval, bool doit, GucSource source);
|
||||||
static const char *assign_custom_variable_classes(const char *newval, bool doit,
|
static const char *assign_custom_variable_classes(const char *newval, bool doit,
|
||||||
GucSource source);
|
GucSource source);
|
||||||
@ -144,9 +145,10 @@ bool default_with_oids = false;
|
|||||||
int log_min_error_statement = PANIC;
|
int log_min_error_statement = PANIC;
|
||||||
int log_min_messages = NOTICE;
|
int log_min_messages = NOTICE;
|
||||||
int client_min_messages = NOTICE;
|
int client_min_messages = NOTICE;
|
||||||
|
|
||||||
int log_min_duration_statement = -1;
|
int log_min_duration_statement = -1;
|
||||||
|
|
||||||
|
int num_temp_buffers = 1000;
|
||||||
|
|
||||||
char *ConfigFileName;
|
char *ConfigFileName;
|
||||||
char *HbaFileName;
|
char *HbaFileName;
|
||||||
char *IdentFileName;
|
char *IdentFileName;
|
||||||
@ -966,6 +968,15 @@ static struct config_int ConfigureNamesInt[] =
|
|||||||
1000, 16, INT_MAX / BLCKSZ, NULL, NULL
|
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,
|
{"port", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
|
||||||
gettext_noop("Sets the TCP port the server listens on."),
|
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 */
|
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
|
static bool
|
||||||
assign_phony_autocommit(bool newval, bool doit, GucSource source)
|
assign_phony_autocommit(bool newval, bool doit, GucSource source)
|
||||||
{
|
{
|
||||||
|
@ -74,6 +74,7 @@
|
|||||||
# - Memory -
|
# - Memory -
|
||||||
|
|
||||||
#shared_buffers = 1000 # min 16, at least max_connections*2, 8KB each
|
#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
|
#work_mem = 1024 # min 64, size in KB
|
||||||
#maintenance_work_mem = 16384 # min 1024, size in KB
|
#maintenance_work_mem = 16384 # min 1024, size in KB
|
||||||
#max_stack_depth = 2048 # min 100, size in KB
|
#max_stack_depth = 2048 # min 100, size in KB
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (c) 2000-2005, PostgreSQL Global Development Group
|
* 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",
|
"superuser_reserved_connections",
|
||||||
"syslog_facility",
|
"syslog_facility",
|
||||||
"syslog_ident",
|
"syslog_ident",
|
||||||
|
"temp_buffers",
|
||||||
"TimeZone",
|
"TimeZone",
|
||||||
"trace_notify",
|
"trace_notify",
|
||||||
"transform_null_equals",
|
"transform_null_equals",
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* 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 BufferSync(void);
|
||||||
extern void BgBufferSync(void);
|
extern void BgBufferSync(void);
|
||||||
|
|
||||||
extern void InitLocalBuffer(void);
|
|
||||||
extern void AtProcExit_LocalBuffers(void);
|
extern void AtProcExit_LocalBuffers(void);
|
||||||
|
|
||||||
/* in freelist.c */
|
/* in freelist.c */
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* Copyright (c) 2000-2005, PostgreSQL Global Development Group
|
* Copyright (c) 2000-2005, PostgreSQL Global Development Group
|
||||||
* Written by Peter Eisentraut <peter_e@gmx.net>.
|
* 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
|
#ifndef GUC_H
|
||||||
@ -126,6 +126,8 @@ extern int log_min_messages;
|
|||||||
extern int client_min_messages;
|
extern int client_min_messages;
|
||||||
extern int log_min_duration_statement;
|
extern int log_min_duration_statement;
|
||||||
|
|
||||||
|
extern int num_temp_buffers;
|
||||||
|
|
||||||
extern char *ConfigFileName;
|
extern char *ConfigFileName;
|
||||||
extern char *HbaFileName;
|
extern char *HbaFileName;
|
||||||
extern char *IdentFileName;
|
extern char *IdentFileName;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user