public inbox for [email protected]help / color / mirror / Atom feed
[PATCH 9/9] Ignore correlation for new BRIN opclasses 3+ messages / 3 participants [nested] [flat]
* [PATCH 9/9] Ignore correlation for new BRIN opclasses @ 2020-09-12 13:07 Tomas Vondra <[email protected]> 0 siblings, 0 replies; 3+ messages in thread From: Tomas Vondra @ 2020-09-12 13:07 UTC (permalink / raw) The new BRIN opclasses (bloom and minmax-multi) are less sensitive to poorly correlated data, so just assume the data is perfectly correlated during costing. Author: Tomas Vondra <[email protected]> Discussion: https://postgr.es/m/[email protected] --- src/backend/access/brin/brin_bloom.c | 1 + src/backend/access/brin/brin_minmax_multi.c | 1 + src/backend/utils/adt/selfuncs.c | 19 ++++++++++++++++++- src/include/access/brin_internal.h | 3 +++ 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/backend/access/brin/brin_bloom.c b/src/backend/access/brin/brin_bloom.c index 15a8258677..d2c4172f48 100644 --- a/src/backend/access/brin/brin_bloom.c +++ b/src/backend/access/brin/brin_bloom.c @@ -410,6 +410,7 @@ brin_bloom_opcinfo(PG_FUNCTION_ARGS) result = palloc0(MAXALIGN(SizeofBrinOpcInfo(1)) + sizeof(BloomOpaque)); + result->oi_ignore_correlation = true; result->oi_nstored = 1; result->oi_regular_nulls = true; result->oi_opaque = (BloomOpaque *) diff --git a/src/backend/access/brin/brin_minmax_multi.c b/src/backend/access/brin/brin_minmax_multi.c index 02aa618b49..437efa8d31 100644 --- a/src/backend/access/brin/brin_minmax_multi.c +++ b/src/backend/access/brin/brin_minmax_multi.c @@ -1798,6 +1798,7 @@ brin_minmax_multi_opcinfo(PG_FUNCTION_ARGS) result = palloc0(MAXALIGN(SizeofBrinOpcInfo(1)) + sizeof(MinmaxMultiOpaque)); + result->oi_ignore_correlation = true; result->oi_nstored = 1; result->oi_regular_nulls = true; result->oi_opaque = (MinmaxMultiOpaque *) diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index 47ca4ddbb5..bf40f9ce32 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -98,6 +98,7 @@ #include <math.h> #include "access/brin.h" +#include "access/brin_internal.h" #include "access/brin_page.h" #include "access/gin.h" #include "access/table.h" @@ -7352,7 +7353,8 @@ brincostestimate(PlannerInfo *root, IndexPath *path, double loop_count, double minimalRanges; double estimatedRanges; double selec; - Relation indexRel; + Relation indexRel = NULL; + TupleDesc tupdesc = NULL; ListCell *l; VariableStatData vardata; @@ -7374,6 +7376,7 @@ brincostestimate(PlannerInfo *root, IndexPath *path, double loop_count, */ indexRel = index_open(index->indexoid, NoLock); brinGetStats(indexRel, &statsData); + tupdesc = RelationGetDescr(indexRel); index_close(indexRel, NoLock); /* work out the actual number of ranges in the index */ @@ -7407,6 +7410,17 @@ brincostestimate(PlannerInfo *root, IndexPath *path, double loop_count, { IndexClause *iclause = lfirst_node(IndexClause, l); AttrNumber attnum = index->indexkeys[iclause->indexcol]; + FmgrInfo *opcInfoFn; + BrinOpcInfo *opcInfo; + Form_pg_attribute attr = TupleDescAttr(tupdesc, iclause->indexcol); + bool ignore_correlation; + + opcInfoFn = index_getprocinfo(indexRel, iclause->indexcol + 1, BRIN_PROCNUM_OPCINFO); + + opcInfo = (BrinOpcInfo *) + DatumGetPointer(FunctionCall1(opcInfoFn, attr->atttypid)); + + ignore_correlation = opcInfo->oi_ignore_correlation; /* attempt to lookup stats in relation for this index column */ if (attnum != 0) @@ -7477,6 +7491,9 @@ brincostestimate(PlannerInfo *root, IndexPath *path, double loop_count, if (sslot.nnumbers > 0) varCorrelation = Abs(sslot.numbers[0]); + if (ignore_correlation) + varCorrelation = 1.0; + if (varCorrelation > *indexCorrelation) *indexCorrelation = varCorrelation; diff --git a/src/include/access/brin_internal.h b/src/include/access/brin_internal.h index fdaff42722..5fbf8cf9c7 100644 --- a/src/include/access/brin_internal.h +++ b/src/include/access/brin_internal.h @@ -30,6 +30,9 @@ typedef struct BrinOpcInfo /* Regular processing of NULLs in BrinValues? */ bool oi_regular_nulls; + /* Ignore correlation during cost estimation */ + bool oi_ignore_correlation; + /* Opaque pointer for the opclass' private use */ void *oi_opaque; -- 2.26.2 --------------4B194FF8F3EA3786FF9EAE1F Content-Type: text/x-patch; charset=UTF-8; name="0008-Define-multi-minmax-oclasses-for-types-with-20210203.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="0008-Define-multi-minmax-oclasses-for-types-with-20210203.pa"; filename*1="tch" ^ permalink raw reply [nested|flat] 3+ messages in thread
* Standardize spelling of "power of two" @ 2023-08-29 08:56 Kyotaro Horiguchi <[email protected]> 2023-08-29 09:26 ` Re: Standardize spelling of "power of two" Daniel Gustafsson <[email protected]> 0 siblings, 1 reply; 3+ messages in thread From: Kyotaro Horiguchi @ 2023-08-29 08:56 UTC (permalink / raw) To: [email protected] Hello. pg_resetwal and initdb has an error message like this: msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" In other parts in the tree, however, we spell it as "power of two". I think it would make sense to standardize the spelling for consistency. See the attached. regards. -- Kyotaro Horiguchi NTT Open Source Software Center Attachments: [text/x-patch] standardize_spelling_of_power_of_two.patch (1.1K, ../../[email protected]/2-standardize_spelling_of_power_of_two.patch) download | inline diff: diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c index c66467eb95..905b979947 100644 --- a/src/bin/initdb/initdb.c +++ b/src/bin/initdb/initdb.c @@ -3350,7 +3350,7 @@ main(int argc, char *argv[]) check_need_password(authmethodlocal, authmethodhost); if (!IsValidWalSegSize(wal_segment_size_mb * 1024 * 1024)) - pg_fatal("argument of %s must be a power of 2 between 1 and 1024", "--wal-segsize"); + pg_fatal("argument of %s must be a power of two between 1 and 1024", "--wal-segsize"); get_restricted_token(); diff --git a/src/bin/pg_resetwal/pg_resetwal.c b/src/bin/pg_resetwal/pg_resetwal.c index 9bebc2a995..25ecdaaa15 100644 --- a/src/bin/pg_resetwal/pg_resetwal.c +++ b/src/bin/pg_resetwal/pg_resetwal.c @@ -298,7 +298,7 @@ main(int argc, char *argv[]) exit(1); set_wal_segsize = wal_segsize_mb * 1024 * 1024; if (!IsValidWalSegSize(set_wal_segsize)) - pg_fatal("argument of %s must be a power of 2 between 1 and 1024", "--wal-segsize"); + pg_fatal("argument of %s must be a power of two between 1 and 1024", "--wal-segsize"); break; } ^ permalink raw reply [nested|flat] 3+ messages in thread
* Re: Standardize spelling of "power of two" 2023-08-29 08:56 Standardize spelling of "power of two" Kyotaro Horiguchi <[email protected]> @ 2023-08-29 09:26 ` Daniel Gustafsson <[email protected]> 0 siblings, 0 replies; 3+ messages in thread From: Daniel Gustafsson @ 2023-08-29 09:26 UTC (permalink / raw) To: Kyotaro Horiguchi <[email protected]>; +Cc: [email protected] > On 29 Aug 2023, at 10:56, Kyotaro Horiguchi <[email protected]> wrote: > pg_resetwal and initdb has an error message like this: > > msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" > > In other parts in the tree, however, we spell it as "power of two". I > think it would make sense to standardize the spelling for > consistency. See the attached. Agreed. While we have numerous "power of 2" these were the only ones in translated user-facing messages, so I've pushed this to master (it didn't seem worth disrupting translations for 16 as we are so close to wrapping it, if others disagree I can backpatch). -- Daniel Gustafsson ^ permalink raw reply [nested|flat] 3+ messages in thread
end of thread, other threads:[~2023-08-29 09:26 UTC | newest] Thread overview: 3+ messages (download: mbox mbox.gz follow: Atom feed) -- links below jump to the message on this page -- 2020-09-12 13:07 [PATCH 9/9] Ignore correlation for new BRIN opclasses Tomas Vondra <[email protected]> 2023-08-29 08:56 Standardize spelling of "power of two" Kyotaro Horiguchi <[email protected]> 2023-08-29 09:26 ` Re: Standardize spelling of "power of two" Daniel Gustafsson <[email protected]>
This inbox is served by agora; see mirroring instructions for how to clone and mirror all data and code used for this inbox