aboutsummaryrefslogtreecommitdiff
path: root/src/include/storage/smgr.h
diff options
context:
space:
mode:
authorAlvaro Herrera <alvherre@alvh.no-ip.org>2013-01-17 15:55:10 -0300
committerAlvaro Herrera <alvherre@alvh.no-ip.org>2013-01-17 16:13:17 -0300
commit279628a0a7cf582f7dfb68e25b7b76183dd8ff2f (patch)
tree7a9264f50a99eb6d52fcf41d1c6d78e23a07f6bf /src/include/storage/smgr.h
parent0b6329130e8e4576e97ff763f0e773347e1a88af (diff)
downloadpostgresql-279628a0a7cf582f7dfb68e25b7b76183dd8ff2f.tar.gz
postgresql-279628a0a7cf582f7dfb68e25b7b76183dd8ff2f.zip
Accelerate end-of-transaction dropping of relations
When relations are dropped, at end of transaction we need to remove the files and clean the buffer pool of buffers containing pages of those relations. Previously we would scan the buffer pool once per relation to clean up buffers. When there are many relations to drop, the repeated scans make this process slow; so we now instead pass a list of relations to drop and scan the pool once, checking each buffer against the passed list. When the number of relations is larger than a threshold (which as of this patch is being set to 20 relations) we sort the array before starting, and bsearch the array; when it's smaller, we simply scan the array linearly each time, because that's faster. The exact optimal threshold value depends on many factors, but the difference is not likely to be significant enough to justify making it user-settable. This has been measured to be a significant win (a 15x win when dropping 100,000 relations; an extreme case, but reportedly a real one). Author: Tomas Vondra, some tweaks by me Reviewed by: Robert Haas, Shigeru Hanada, Andres Freund, Álvaro Herrera
Diffstat (limited to 'src/include/storage/smgr.h')
-rw-r--r--src/include/storage/smgr.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/src/include/storage/smgr.h b/src/include/storage/smgr.h
index 4547a0f5180..98b6f131374 100644
--- a/src/include/storage/smgr.h
+++ b/src/include/storage/smgr.h
@@ -85,6 +85,7 @@ extern void smgrcloseall(void);
extern void smgrclosenode(RelFileNodeBackend rnode);
extern void smgrcreate(SMgrRelation reln, ForkNumber forknum, bool isRedo);
extern void smgrdounlink(SMgrRelation reln, bool isRedo);
+extern void smgrdounlinkall(SMgrRelation *rels, int nrels, bool isRedo);
extern void smgrdounlinkfork(SMgrRelation reln, ForkNumber forknum, bool isRedo);
extern void smgrextend(SMgrRelation reln, ForkNumber forknum,
BlockNumber blocknum, char *buffer, bool skipFsync);