diff options
author | John Naylor <john.naylor@postgresql.org> | 2024-04-07 12:27:34 +0700 |
---|---|---|
committer | John Naylor <john.naylor@postgresql.org> | 2024-04-08 14:39:49 +0700 |
commit | 8a1b31e6e59631807a08a4e9465134c343bbdf5e (patch) | |
tree | 72f147d6442438d8ce033c981a90a7b9c43a904c /src/backend | |
parent | bb766cde63b4f624d029b34c9cdd3d0a94fd5b46 (diff) | |
download | postgresql-8a1b31e6e59631807a08a4e9465134c343bbdf5e.tar.gz postgresql-8a1b31e6e59631807a08a4e9465134c343bbdf5e.zip |
Use bump context for TID bitmaps stored by vacuum
Vacuum does not pfree individual entries, and only frees the entire
storage space when finished with it. This allows using a bump context,
eliminating the chunk header in each leaf allocation. Most leaf
allocations will be 16 to 32 bytes, so that's a significant savings.
TidStoreCreateLocal gets a boolean parameter to indicate that the
created store is insert-only.
This requires a separate tree context for iteration, since we free
the iteration state after iteration completes.
Discussion: https://postgr.es/m/CANWCAZac%3DpBePg3rhX8nXkUuaLoiAJJLtmnCfZsPEAS4EtJ%3Dkg%40mail.gmail.com
Discussion: https://postgr.es/m/CANWCAZZQFfxvzO8yZHFWtQV+Z2gAMv1ku16Vu7KWmb5kZQyd1w@mail.gmail.com
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/access/common/tidstore.c | 15 | ||||
-rw-r--r-- | src/backend/access/heap/vacuumlazy.c | 4 |
2 files changed, 15 insertions, 4 deletions
diff --git a/src/backend/access/common/tidstore.c b/src/backend/access/common/tidstore.c index 629390a1f88..211d63941c2 100644 --- a/src/backend/access/common/tidstore.c +++ b/src/backend/access/common/tidstore.c @@ -120,7 +120,7 @@ static void tidstore_iter_extract_tids(TidStoreIter *iter, BlockNumber blkno, * by TidStoreMemoryUsage(). */ TidStore * -TidStoreCreateLocal(size_t max_bytes) +TidStoreCreateLocal(size_t max_bytes, bool insert_only) { TidStore *ts; size_t initBlockSize = ALLOCSET_DEFAULT_INITSIZE; @@ -138,11 +138,22 @@ TidStoreCreateLocal(size_t max_bytes) maxBlockSize = ALLOCSET_DEFAULT_INITSIZE; /* Create a memory context for the TID storage */ - ts->rt_context = AllocSetContextCreate(CurrentMemoryContext, + if (insert_only) + { + ts->rt_context = BumpContextCreate(CurrentMemoryContext, "TID storage", minContextSize, initBlockSize, maxBlockSize); + } + else + { + ts->rt_context = AllocSetContextCreate(CurrentMemoryContext, + "TID storage", + minContextSize, + initBlockSize, + maxBlockSize); + } ts->tree.local = local_ts_create(ts->rt_context); diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index c3a9dc1ad6d..de109acc89a 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -2874,7 +2874,7 @@ dead_items_alloc(LVRelState *vacrel, int nworkers) dead_items_info->num_items = 0; vacrel->dead_items_info = dead_items_info; - vacrel->dead_items = TidStoreCreateLocal(dead_items_info->max_bytes); + vacrel->dead_items = TidStoreCreateLocal(dead_items_info->max_bytes, true); } /* @@ -2910,7 +2910,7 @@ dead_items_reset(LVRelState *vacrel) /* Recreate the tidstore with the same max_bytes limitation */ TidStoreDestroy(dead_items); - vacrel->dead_items = TidStoreCreateLocal(vacrel->dead_items_info->max_bytes); + vacrel->dead_items = TidStoreCreateLocal(vacrel->dead_items_info->max_bytes, true); /* Reset the counter */ vacrel->dead_items_info->num_items = 0; |