diff options
author | Teodor Sigaev <teodor@sigaev.ru> | 2015-09-09 18:43:37 +0300 |
---|---|---|
committer | Teodor Sigaev <teodor@sigaev.ru> | 2015-09-09 18:43:37 +0300 |
commit | 013ebc0a7b7ea9c1b1ab7a3d4dd75ea121ea8ba7 (patch) | |
tree | f22d59c51b1df33681b4dcc9e7160b6e6c0fa446 /src/include/access/gist.h | |
parent | 96f6a0cb41ee06673960019f0026b1b0fd1e644d (diff) | |
download | postgresql-013ebc0a7b7ea9c1b1ab7a3d4dd75ea121ea8ba7.tar.gz postgresql-013ebc0a7b7ea9c1b1ab7a3d4dd75ea121ea8ba7.zip |
Microvacuum for GIST
Mark index tuple as dead if it's pointed by kill_prior_tuple during
ordinary (search) scan and remove it during insert process if there is no
enough space for new tuple to insert. This improves select performance
because index will not return tuple marked as dead and improves insert
performance because it reduces number of page split.
Anastasia Lubennikova <a.lubennikova@postgrespro.ru> with
minor editorialization by me
Diffstat (limited to 'src/include/access/gist.h')
-rw-r--r-- | src/include/access/gist.h | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/include/access/gist.h b/src/include/access/gist.h index 81e559bc2dd..ea3a3b01f47 100644 --- a/src/include/access/gist.h +++ b/src/include/access/gist.h @@ -41,8 +41,11 @@ */ #define F_LEAF (1 << 0) /* leaf page */ #define F_DELETED (1 << 1) /* the page has been deleted */ -#define F_TUPLES_DELETED (1 << 2) /* some tuples on the page are dead */ +#define F_TUPLES_DELETED (1 << 2) /* some tuples on the page were + * deleted */ #define F_FOLLOW_RIGHT (1 << 3) /* page to the right has no downlink */ +#define F_HAS_GARBAGE (1 << 4) /* some tuples on the page are dead, + * but not deleted yet */ typedef XLogRecPtr GistNSN; @@ -137,6 +140,10 @@ typedef struct GISTENTRY #define GistMarkTuplesDeleted(page) ( GistPageGetOpaque(page)->flags |= F_TUPLES_DELETED) #define GistClearTuplesDeleted(page) ( GistPageGetOpaque(page)->flags &= ~F_TUPLES_DELETED) +#define GistPageHasGarbage(page) ( GistPageGetOpaque(page)->flags & F_HAS_GARBAGE) +#define GistMarkPageHasGarbage(page) ( GistPageGetOpaque(page)->flags |= F_HAS_GARBAGE) +#define GistClearPageHasGarbage(page) ( GistPageGetOpaque(page)->flags &= ~F_HAS_GARBAGE) + #define GistFollowRight(page) ( GistPageGetOpaque(page)->flags & F_FOLLOW_RIGHT) #define GistMarkFollowRight(page) ( GistPageGetOpaque(page)->flags |= F_FOLLOW_RIGHT) #define GistClearFollowRight(page) ( GistPageGetOpaque(page)->flags &= ~F_FOLLOW_RIGHT) |