mirror of
https://github.com/postgres/postgres.git
synced 2025-08-24 09:27:52 +03:00
Make large sequential scans and VACUUMs work in a limited-size "ring" of
buffers, rather than blowing out the whole shared-buffer arena. Aside from avoiding cache spoliation, this fixes the problem that VACUUM formerly tended to cause a WAL flush for every page it modified, because we had it hacked to use only a single buffer. Those flushes will now occur only once per ring-ful. The exact ring size, and the threshold for seqscans to switch into the ring usage pattern, remain under debate; but the infrastructure seems done. The key bit of infrastructure is a new optional BufferAccessStrategy object that can be passed to ReadBuffer operations; this replaces the former StrategyHintVacuum API. This patch also changes the buffer usage-count methodology a bit: we now advance usage_count when first pinning a buffer, rather than when last unpinning it. To preserve the behavior that a buffer's lifetime starts to decrease when it's released, the clock sweep code is modified to not decrement usage_count of pinned buffers. Work not done in this commit: teach GiST and GIN indexes to use the vacuum BufferAccessStrategy for vacuum-driven fetches. Original patch by Simon, reworked by Heikki and again by Tom.
This commit is contained in:
@@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/storage/bufmgr.h,v 1.103 2007/05/02 23:18:03 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/include/storage/bufmgr.h,v 1.104 2007/05/30 20:12:03 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -19,6 +19,14 @@
|
||||
|
||||
typedef void *Block;
|
||||
|
||||
/* Possible arguments for GetAccessStrategy() */
|
||||
typedef enum BufferAccessStrategyType
|
||||
{
|
||||
BAS_NORMAL, /* Normal random access */
|
||||
BAS_BULKREAD, /* Large read-only scan (hint bit updates are ok) */
|
||||
BAS_VACUUM /* VACUUM */
|
||||
} BufferAccessStrategyType;
|
||||
|
||||
/* in globals.c ... this duplicates miscadmin.h */
|
||||
extern DLLIMPORT int NBuffers;
|
||||
|
||||
@@ -111,6 +119,8 @@ extern DLLIMPORT int32 *LocalRefCount;
|
||||
* prototypes for functions in bufmgr.c
|
||||
*/
|
||||
extern Buffer ReadBuffer(Relation reln, BlockNumber blockNum);
|
||||
extern Buffer ReadBufferWithStrategy(Relation reln, BlockNumber blockNum,
|
||||
BufferAccessStrategy strategy);
|
||||
extern Buffer ReadOrZeroBuffer(Relation reln, BlockNumber blockNum);
|
||||
extern void ReleaseBuffer(Buffer buffer);
|
||||
extern void UnlockReleaseBuffer(Buffer buffer);
|
||||
@@ -157,6 +167,7 @@ extern void BgBufferSync(void);
|
||||
extern void AtProcExit_LocalBuffers(void);
|
||||
|
||||
/* in freelist.c */
|
||||
extern void StrategyHintVacuum(bool vacuum_active);
|
||||
extern BufferAccessStrategy GetAccessStrategy(BufferAccessStrategyType btype);
|
||||
extern void FreeAccessStrategy(BufferAccessStrategy strategy);
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user