aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--contrib/amcheck/verify_nbtree.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/contrib/amcheck/verify_nbtree.c b/contrib/amcheck/verify_nbtree.c
index 9126c18d0e1..55a3a4bbe0c 100644
--- a/contrib/amcheck/verify_nbtree.c
+++ b/contrib/amcheck/verify_nbtree.c
@@ -377,11 +377,20 @@ bt_check_every_level(Relation rel, Relation heaprel, bool heapkeyspace,
if (state->heapallindexed)
{
+ int64 total_pages;
int64 total_elems;
uint64 seed;
- /* Size Bloom filter based on estimated number of tuples in index */
- total_elems = (int64) state->rel->rd_rel->reltuples;
+ /*
+ * Size Bloom filter based on estimated number of tuples in index,
+ * while conservatively assuming that each block must contain at least
+ * MaxIndexTuplesPerPage / 5 non-pivot tuples. (Non-leaf pages cannot
+ * contain non-pivot tuples. That's okay because they generally make
+ * up no more than about 1% of all pages in the index.)
+ */
+ total_pages = RelationGetNumberOfBlocks(rel);
+ total_elems = Max(total_pages * (MaxIndexTuplesPerPage / 5),
+ (int64) state->rel->rd_rel->reltuples);
/* Random seed relies on backend srandom() call to avoid repetition */
seed = random();
/* Create Bloom filter to fingerprint index */
@@ -425,8 +434,6 @@ bt_check_every_level(Relation rel, Relation heaprel, bool heapkeyspace,
}
else
{
- int64 total_pages;
-
/*
* Extra readonly downlink check.
*
@@ -437,7 +444,6 @@ bt_check_every_level(Relation rel, Relation heaprel, bool heapkeyspace,
* splits and page deletions, though. This is taken care of in
* bt_downlink_missing_check().
*/
- total_pages = (int64) state->rel->rd_rel->relpages;
state->downlinkfilter = bloom_create(total_pages, work_mem, seed);
}
}