mirror of
https://github.com/postgres/postgres.git
synced 2025-11-10 17:42:29 +03:00
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:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user