Skip to content

Commit 91728fa

Browse files
committed
Add temp_buffers GUC variable to allow users to determine the size
of the local buffer arena for temporary table access.
1 parent d65522a commit 91728fa

File tree

8 files changed

+89
-28
lines changed

8 files changed

+89
-28
lines changed

doc/src/sgml/runtime.sgml

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<!--
2-
$PostgreSQL: pgsql/doc/src/sgml/runtime.sgml,v 1.309 2005/03/14 06:49:48 neilc Exp $
2+
$PostgreSQL: pgsql/doc/src/sgml/runtime.sgml,v 1.310 2005/03/19 23:27:04 tgl Exp $
33
-->
44

55
<chapter Id="runtime">
@@ -1038,6 +1038,33 @@ SET ENABLE_SEQSCAN TO OFF;
10381038
</listitem>
10391039
</varlistentry>
10401040

1041+
<varlistentry id="guc-temp-buffers" xreflabel="temp_buffers">
1042+
<term><varname>temp_buffers</varname> (<type>integer</type>)</term>
1043+
<indexterm>
1044+
<primary><varname>temp_buffers</> configuration parameter</primary>
1045+
</indexterm>
1046+
<listitem>
1047+
<para>
1048+
Sets the maximum number of temporary buffers used by each database
1049+
session. These are session-local buffers used only for access
1050+
to temporary tables. The default is 1000. The setting can
1051+
be changed within individual sessions, but only up until the
1052+
first use of temporary tables within a session; subsequent
1053+
attempts to change the value will have no effect on that session.
1054+
</para>
1055+
1056+
<para>
1057+
A session will allocate temporary buffers as needed up to the limit
1058+
given by <varname>temp_buffers</>. The cost of setting a large
1059+
value in sessions that do not actually need a lot of temporary
1060+
buffers is only a buffer descriptor, or about 64 bytes, per
1061+
increment in <varname>temp_buffers</>. However if a buffer is
1062+
actually used an additional 8192 bytes will be consumed for it
1063+
(or in general <symbol>BLCKSZ</symbol> bytes).
1064+
</para>
1065+
</listitem>
1066+
</varlistentry>
1067+
10411068
<varlistentry id="guc-work-mem" xreflabel="work_mem">
10421069
<term><varname>work_mem</varname> (<type>integer</type>)</term>
10431070
<indexterm>

src/backend/storage/buffer/localbuf.c

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
*
1010
*
1111
* IDENTIFICATION
12-
* $PostgreSQL: pgsql/src/backend/storage/buffer/localbuf.c,v 1.65 2005/03/19 17:39:43 tgl Exp $
12+
* $PostgreSQL: pgsql/src/backend/storage/buffer/localbuf.c,v 1.66 2005/03/19 23:27:05 tgl Exp $
1313
*
1414
*-------------------------------------------------------------------------
1515
*/
@@ -18,6 +18,7 @@
1818
#include "storage/buf_internals.h"
1919
#include "storage/bufmgr.h"
2020
#include "storage/smgr.h"
21+
#include "utils/guc.h"
2122
#include "utils/memutils.h"
2223
#include "utils/resowner.h"
2324

@@ -46,6 +47,9 @@ static int nextFreeLocalBuf = 0;
4647
static HTAB *LocalBufHash = NULL;
4748

4849

50+
static void InitLocalBuffers(void);
51+
52+
4953
/*
5054
* LocalBufferAlloc -
5155
* 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)
6670

6771
INIT_BUFFERTAG(newTag, reln, blockNum);
6872

73+
/* Initialize local buffers if first request in this session */
74+
if (LocalBufHash == NULL)
75+
InitLocalBuffers();
76+
6977
/* See if the desired buffer already exists */
7078
hresult = (LocalBufferLookupEnt *)
7179
hash_search(LocalBufHash, (void *) &newTag, HASH_FIND, NULL);
@@ -238,32 +246,18 @@ WriteLocalBuffer(Buffer buffer, bool release)
238246
}
239247

240248
/*
241-
* InitLocalBuffer -
249+
* InitLocalBuffers -
242250
* init the local buffer cache. Since most queries (esp. multi-user ones)
243251
* don't involve local buffers, we delay allocating actual memory for the
244252
* buffers until we need them; just make the buffer headers here.
245253
*/
246-
void
247-
InitLocalBuffer(void)
254+
static void
255+
InitLocalBuffers(void)
248256
{
249-
int nbufs = 64; /* should be from a GUC var */
257+
int nbufs = num_temp_buffers;
250258
HASHCTL info;
251259
int i;
252260

253-
/* Create the lookup hash table */
254-
MemSet(&info, 0, sizeof(info));
255-
info.keysize = sizeof(BufferTag);
256-
info.entrysize = sizeof(LocalBufferLookupEnt);
257-
info.hash = tag_hash;
258-
259-
LocalBufHash = hash_create("Local Buffer Lookup Table",
260-
nbufs,
261-
&info,
262-
HASH_ELEM | HASH_FUNCTION);
263-
264-
if (!LocalBufHash)
265-
elog(ERROR, "could not initialize local buffer hash table");
266-
267261
/* Allocate and zero buffer headers and auxiliary arrays */
268262
LocalBufferDescriptors = (BufferDesc *)
269263
MemoryContextAllocZero(TopMemoryContext,
@@ -291,6 +285,20 @@ InitLocalBuffer(void)
291285
buf->buf_id = -i - 2;
292286
}
293287

288+
/* Create the lookup hash table */
289+
MemSet(&info, 0, sizeof(info));
290+
info.keysize = sizeof(BufferTag);
291+
info.entrysize = sizeof(LocalBufferLookupEnt);
292+
info.hash = tag_hash;
293+
294+
LocalBufHash = hash_create("Local Buffer Lookup Table",
295+
nbufs,
296+
&info,
297+
HASH_ELEM | HASH_FUNCTION);
298+
299+
if (!LocalBufHash)
300+
elog(ERROR, "could not initialize local buffer hash table");
301+
294302
/* Initialization done, mark buffers allocated */
295303
NLocBuffer = nbufs;
296304
}

src/backend/utils/init/postinit.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/utils/init/postinit.c,v 1.143 2005/03/18 16:16:09 tgl Exp $
11+
* $PostgreSQL: pgsql/src/backend/utils/init/postinit.c,v 1.144 2005/03/19 23:27:06 tgl Exp $
1212
*
1313
*
1414
*-------------------------------------------------------------------------
@@ -257,7 +257,6 @@ BaseInit(void)
257257
/* Do local initialization of storage and buffer managers */
258258
smgrinit();
259259
InitBufferPoolAccess();
260-
InitLocalBuffer();
261260
}
262261

263262

src/backend/utils/misc/guc.c

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
* Written by Peter Eisentraut <peter_e@gmx.net>.
1111
*
1212
* IDENTIFICATION
13-
* $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.255 2005/03/13 09:36:31 neilc Exp $
13+
* $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.256 2005/03/19 23:27:07 tgl Exp $
1414
*
1515
*--------------------------------------------------------------------
1616
*/
@@ -104,6 +104,7 @@ static const char *assign_log_error_verbosity(const char *newval, bool doit,
104104
GucSource source);
105105
static const char *assign_log_statement(const char *newval, bool doit,
106106
GucSource source);
107+
static const char *show_num_temp_buffers(void);
107108
static bool assign_phony_autocommit(bool newval, bool doit, GucSource source);
108109
static const char *assign_custom_variable_classes(const char *newval, bool doit,
109110
GucSource source);
@@ -144,9 +145,10 @@ bool default_with_oids = false;
144145
int log_min_error_statement = PANIC;
145146
int log_min_messages = NOTICE;
146147
int client_min_messages = NOTICE;
147-
148148
int log_min_duration_statement = -1;
149149

150+
int num_temp_buffers = 1000;
151+
150152
char *ConfigFileName;
151153
char *HbaFileName;
152154
char *IdentFileName;
@@ -966,6 +968,15 @@ static struct config_int ConfigureNamesInt[] =
966968
1000, 16, INT_MAX / BLCKSZ, NULL, NULL
967969
},
968970

971+
{
972+
{"temp_buffers", PGC_USERSET, RESOURCES_MEM,
973+
gettext_noop("Sets the maximum number of temporary buffers used by each session."),
974+
NULL
975+
},
976+
&num_temp_buffers,
977+
1000, 100, INT_MAX / BLCKSZ, NULL, show_num_temp_buffers
978+
},
979+
969980
{
970981
{"port", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
971982
gettext_noop("Sets the TCP port the server listens on."),
@@ -5496,6 +5507,19 @@ assign_log_statement(const char *newval, bool doit, GucSource source)
54965507
return newval; /* OK */
54975508
}
54985509

5510+
static const char *
5511+
show_num_temp_buffers(void)
5512+
{
5513+
/*
5514+
* We show the GUC var until local buffers have been initialized,
5515+
* and NLocBuffer afterwards.
5516+
*/
5517+
static char nbuf[32];
5518+
5519+
sprintf(nbuf, "%d", NLocBuffer ? NLocBuffer : num_temp_buffers);
5520+
return nbuf;
5521+
}
5522+
54995523
static bool
55005524
assign_phony_autocommit(bool newval, bool doit, GucSource source)
55015525
{

src/backend/utils/misc/postgresql.conf.sample

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
# - Memory -
7575

7676
#shared_buffers = 1000 # min 16, at least max_connections*2, 8KB each
77+
#temp_buffers = 1000 # min 100, 8KB each
7778
#work_mem = 1024 # min 64, size in KB
7879
#maintenance_work_mem = 16384 # min 1024, size in KB
7980
#max_stack_depth = 2048 # min 100, size in KB

src/bin/psql/tab-complete.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
*
44
* Copyright (c) 2000-2005, PostgreSQL Global Development Group
55
*
6-
* $PostgreSQL: pgsql/src/bin/psql/tab-complete.c,v 1.121 2005/01/23 15:58:50 momjian Exp $
6+
* $PostgreSQL: pgsql/src/bin/psql/tab-complete.c,v 1.122 2005/03/19 23:27:08 tgl Exp $
77
*/
88

99
/*----------------------------------------------------------------------
@@ -594,6 +594,7 @@ psql_completion(char *text, int start, int end)
594594
"superuser_reserved_connections",
595595
"syslog_facility",
596596
"syslog_ident",
597+
"temp_buffers",
597598
"TimeZone",
598599
"trace_notify",
599600
"transform_null_equals",

src/include/storage/bufmgr.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
10-
* $PostgreSQL: pgsql/src/include/storage/bufmgr.h,v 1.91 2005/03/18 16:16:09 tgl Exp $
10+
* $PostgreSQL: pgsql/src/include/storage/bufmgr.h,v 1.92 2005/03/19 23:27:10 tgl Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -157,7 +157,6 @@ extern void BufmgrCommit(void);
157157
extern void BufferSync(void);
158158
extern void BgBufferSync(void);
159159

160-
extern void InitLocalBuffer(void);
161160
extern void AtProcExit_LocalBuffers(void);
162161

163162
/* in freelist.c */

src/include/utils/guc.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Copyright (c) 2000-2005, PostgreSQL Global Development Group
88
* Written by Peter Eisentraut <peter_e@gmx.net>.
99
*
10-
* $PostgreSQL: pgsql/src/include/utils/guc.h,v 1.58 2005/01/01 05:43:09 momjian Exp $
10+
* $PostgreSQL: pgsql/src/include/utils/guc.h,v 1.59 2005/03/19 23:27:11 tgl Exp $
1111
*--------------------------------------------------------------------
1212
*/
1313
#ifndef GUC_H
@@ -126,6 +126,8 @@ extern int log_min_messages;
126126
extern int client_min_messages;
127127
extern int log_min_duration_statement;
128128

129+
extern int num_temp_buffers;
130+
129131
extern char *ConfigFileName;
130132
extern char *HbaFileName;
131133
extern char *IdentFileName;

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy