agora inbox for [email protected]
help / color / mirror / Atom feedFrom: Tomas Vondra <[email protected]>
Subject: [PATCH 6/8] add sort_mode opclass parameter
Date: Wed, 16 Dec 2020 23:57:11 +0100
---
src/backend/access/brin/brin_bloom.c | 34 ++++++++++++++++++++++------
1 file changed, 27 insertions(+), 7 deletions(-)
diff --git a/src/backend/access/brin/brin_bloom.c b/src/backend/access/brin/brin_bloom.c
index ffeb459d3e..ac5a5c249c 100644
--- a/src/backend/access/brin/brin_bloom.c
+++ b/src/backend/access/brin/brin_bloom.c
@@ -180,6 +180,7 @@ typedef struct BloomOptions
int32 vl_len_; /* varlena header (do not touch directly!) */
double nDistinctPerRange; /* number of distinct values per range */
double falsePositiveRate; /* false positive for bloom filter */
+ bool sortMode; /* start in sort mode */
} BloomOptions;
/*
@@ -216,6 +217,7 @@ typedef struct BloomOptions
#define BLOOM_MIN_FALSE_POSITIVE_RATE 0.0001 /* 0.01% fp rate */
#define BLOOM_MAX_FALSE_POSITIVE_RATE 0.25 /* 25% fp rate */
#define BLOOM_DEFAULT_FALSE_POSITIVE_RATE 0.01 /* 1% fp rate */
+#define BLOOM_DEFAULT_SORT_MODE true /* start in sort */
#define BloomGetNDistinctPerRange(opts) \
((opts) && (((BloomOptions *) (opts))->nDistinctPerRange != 0) ? \
@@ -227,6 +229,10 @@ typedef struct BloomOptions
(((BloomOptions *) (opts))->falsePositiveRate) : \
BLOOM_DEFAULT_FALSE_POSITIVE_RATE)
+#define BloomGetSortMode(opts) \
+ ((opts) ? (((BloomOptions *) (opts))->sortMode) : \
+ BLOOM_DEFAULT_SORT_MODE)
+
/*
* Bloom Filter
*
@@ -302,7 +308,7 @@ static BloomFilter *bloom_switch_to_hashing(BloomFilter *filter);
* varlena.
*/
static BloomFilter *
-bloom_init(int ndistinct, double false_positive_rate)
+bloom_init(bool sort_mode, int ndistinct, double false_positive_rate)
{
Size len;
BloomFilter *filter;
@@ -336,17 +342,26 @@ bloom_init(int ndistinct, double false_positive_rate)
k = (k - floor(k) >= 0.5) ? ceil(k) : floor(k);
/*
- * Allocate the bloom filter (initially it's just a header, we'll make
- * it larger as needed).
+ * When sort phase is enabled, allocate just the header - we'll make
+ * it larger as needed. In hash mode we allocate the whole filter.
+ *
+ * XXX We might add some sort of sparse bitmap, which might work for
+ * bloom filters with only a couple items.
*/
- len = offsetof(BloomFilter, data);
+ if (sort_mode)
+ len = offsetof(BloomFilter, data);
+ else
+ len = offsetof(BloomFilter, data) + (m / 8);
filter = (BloomFilter *) palloc0(len);
- filter->flags = 0; /* implies SORTED phase */
+ filter->flags = 0;
filter->nhashes = (int) k;
filter->nbits = m;
+ if (!sort_mode)
+ filter->flags |= BLOOM_FLAG_PHASE_HASH;
+
SET_VARSIZE(filter, len);
return filter;
@@ -757,7 +772,6 @@ brin_bloom_get_ndistinct(BrinDesc *bdesc, BloomOptions *opts)
return (int) ndistinct;
}
-
/*
* Examine the given index tuple (which contains partial status of a certain
* page range) by comparing it to the given value that comes from another heap
@@ -790,7 +804,8 @@ brin_bloom_add_value(PG_FUNCTION_ARGS)
*/
if (column->bv_allnulls)
{
- filter = bloom_init(brin_bloom_get_ndistinct(bdesc, opts),
+ filter = bloom_init(BloomGetSortMode(opts),
+ brin_bloom_get_ndistinct(bdesc, opts),
BloomGetFalsePositiveRate(opts));
column->bv_values[0] = PointerGetDatum(filter);
column->bv_allnulls = false;
@@ -1022,6 +1037,11 @@ brin_bloom_options(PG_FUNCTION_ARGS)
BLOOM_MAX_FALSE_POSITIVE_RATE,
offsetof(BloomOptions, falsePositiveRate));
+ add_local_bool_reloption(relopts, "sort_mode",
+ "start the bloom filter in sort mode",
+ BLOOM_DEFAULT_SORT_MODE,
+ offsetof(BloomOptions, sortMode));
+
PG_RETURN_VOID();
}
--
2.26.2
--------------CF71AF65F7C337C37C24B045
Content-Type: text/x-patch; charset=UTF-8;
name="0007-BRIN-minmax-multi-indexes-20210112.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename="0007-BRIN-minmax-multi-indexes-20210112.patch"
view thread (22+ messages) latest in thread
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: [email protected]
Cc: [email protected]
Subject: Re: [PATCH 6/8] add sort_mode opclass parameter
In-Reply-To: <no-message-id-1869522@localhost>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox