mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
Improve handling of dead tuples in hash indexes.
When squeezing a bucket during vacuum, it's not necessary to retain any tuples already marked as dead, so ignore them when deciding which tuples must be moved in order to empty a bucket page. Similarly, when splitting a bucket, relocating dead tuples to the new bucket is a waste of effort; instead, just ignore them. Amit Kapila, reviewed by me. Testing help provided by Ashutosh Sharma.
This commit is contained in:
@ -656,6 +656,10 @@ _hash_squeezebucket(Relation rel,
|
|||||||
IndexTuple itup;
|
IndexTuple itup;
|
||||||
Size itemsz;
|
Size itemsz;
|
||||||
|
|
||||||
|
/* skip dead tuples */
|
||||||
|
if (ItemIdIsDead(PageGetItemId(rpage, roffnum)))
|
||||||
|
continue;
|
||||||
|
|
||||||
itup = (IndexTuple) PageGetItem(rpage,
|
itup = (IndexTuple) PageGetItem(rpage,
|
||||||
PageGetItemId(rpage, roffnum));
|
PageGetItemId(rpage, roffnum));
|
||||||
itemsz = IndexTupleDSize(*itup);
|
itemsz = IndexTupleDSize(*itup);
|
||||||
|
@ -811,6 +811,10 @@ _hash_splitbucket(Relation rel,
|
|||||||
Size itemsz;
|
Size itemsz;
|
||||||
Bucket bucket;
|
Bucket bucket;
|
||||||
|
|
||||||
|
/* skip dead tuples */
|
||||||
|
if (ItemIdIsDead(PageGetItemId(opage, ooffnum)))
|
||||||
|
continue;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fetch the item's hash key (conveniently stored in the item) and
|
* Fetch the item's hash key (conveniently stored in the item) and
|
||||||
* determine which bucket it now belongs in.
|
* determine which bucket it now belongs in.
|
||||||
|
Reference in New Issue
Block a user