v1-0001-Don-t-avoid-applying-HOT-when-page-is-marked-full.patch
application/octet-stream
Filename: v1-0001-Don-t-avoid-applying-HOT-when-page-is-marked-full.patch
Type: application/octet-stream
Part: 0
Patch
Format: format-patch
Series: patch v1-0001
Subject: Don't avoid applying HOT when page is marked full.
| File | + | − |
|---|---|---|
| src/backend/access/heap/heapam.c | 6 | 25 |
From e4c2373031b2c0313547577b019b1d30cd03b83d Mon Sep 17 00:00:00 2001
From: Peter Geoghegan <pg@bowt.ie>
Date: Wed, 17 Nov 2021 17:58:48 -0800
Subject: [PATCH v1] Don't avoid applying HOT when page is marked full.
---
src/backend/access/heap/heapam.c | 31 ++++++-------------------------
1 file changed, 6 insertions(+), 25 deletions(-)
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index ec234a5e5..29a4bf0c7 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -3179,7 +3179,6 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup,
bool have_tuple_lock = false;
bool iscombo;
bool use_hot_update = false;
- bool hot_attrs_checked = false;
bool key_intact;
bool all_visible_cleared = false;
bool all_visible_cleared_new = false;
@@ -3228,32 +3227,15 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup,
key_attrs = RelationGetIndexAttrBitmap(relation, INDEX_ATTR_BITMAP_KEY);
id_attrs = RelationGetIndexAttrBitmap(relation,
INDEX_ATTR_BITMAP_IDENTITY_KEY);
-
+ interesting_attrs = NULL;
+ interesting_attrs = bms_add_members(interesting_attrs, hot_attrs);
+ interesting_attrs = bms_add_members(interesting_attrs, key_attrs);
+ interesting_attrs = bms_add_members(interesting_attrs, id_attrs);
block = ItemPointerGetBlockNumber(otid);
buffer = ReadBuffer(relation, block);
page = BufferGetPage(buffer);
- interesting_attrs = NULL;
-
- /*
- * If the page is already full, there is hardly any chance of doing a HOT
- * update on this page. It might be wasteful effort to look for index
- * column updates only to later reject HOT updates for lack of space in
- * the same page. So we be conservative and only fetch hot_attrs if the
- * page is not already full. Since we are already holding a pin on the
- * buffer, there is no chance that the buffer can get cleaned up
- * concurrently and even if that was possible, in the worst case we lose a
- * chance to do a HOT update.
- */
- if (!PageIsFull(page))
- {
- interesting_attrs = bms_add_members(interesting_attrs, hot_attrs);
- hot_attrs_checked = true;
- }
- interesting_attrs = bms_add_members(interesting_attrs, key_attrs);
- interesting_attrs = bms_add_members(interesting_attrs, id_attrs);
-
/*
* Before locking the buffer, pin the visibility map page if it appears to
* be necessary. Since we haven't got the lock yet, someone else might be
@@ -3867,10 +3849,9 @@ l2:
/*
* Since the new tuple is going into the same page, we might be able
* to do a HOT update. Check if any of the index columns have been
- * changed. If the page was already full, we may have skipped checking
- * for index columns, and also can't do a HOT update.
+ * changed.
*/
- if (hot_attrs_checked && !bms_overlap(modified_attrs, hot_attrs))
+ if (!bms_overlap(modified_attrs, hot_attrs))
use_hot_update = true;
}
else
--
2.30.2