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:
Robert Haas 2016-11-08 10:47:52 -05:00
parent 650b967076
commit f0e72a25b0
2 changed files with 8 additions and 0 deletions

View File

@ -656,6 +656,10 @@ _hash_squeezebucket(Relation rel,
IndexTuple itup;
Size itemsz;
/* skip dead tuples */
if (ItemIdIsDead(PageGetItemId(rpage, roffnum)))
continue;
itup = (IndexTuple) PageGetItem(rpage,
PageGetItemId(rpage, roffnum));
itemsz = IndexTupleDSize(*itup);

View File

@ -811,6 +811,10 @@ _hash_splitbucket(Relation rel,
Size itemsz;
Bucket bucket;
/* skip dead tuples */
if (ItemIdIsDead(PageGetItemId(opage, ooffnum)))
continue;
/*
* Fetch the item's hash key (conveniently stored in the item) and
* determine which bucket it now belongs in.