From: Robert Haas Date: Tue, 8 Nov 2016 15:47:52 +0000 (-0500) Subject: Improve handling of dead tuples in hash indexes. X-Git-Tag: REL_10_BETA1~1432 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f0e72a25b05d4c29d0102fa0b892782ff193a00e;p=postgresql 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. --- diff --git a/src/backend/access/hash/hashovfl.c b/src/backend/access/hash/hashovfl.c index db3e268a76..df7af3ec84 100644 --- a/src/backend/access/hash/hashovfl.c +++ b/src/backend/access/hash/hashovfl.c @@ -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); diff --git a/src/backend/access/hash/hashpage.c b/src/backend/access/hash/hashpage.c index 178463fcb6..a5e9d176a7 100644 --- a/src/backend/access/hash/hashpage.c +++ b/src/backend/access/hash/hashpage.c @@ -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.