diff options
author | Alexander Korotkov <akorotkov@postgresql.org> | 2024-04-08 01:27:28 +0300 |
---|---|---|
committer | Alexander Korotkov <akorotkov@postgresql.org> | 2024-04-08 01:27:52 +0300 |
commit | 72bd38cc99a15da6f97373fae98027c908c398ea (patch) | |
tree | 090cdaccbab7286e709f6ebe9a4ddc6142e936f8 /src/backend/utils/misc/guc_tables.c | |
parent | 75a47b6a0dc4a235307e1acd1a6b3845cb881e55 (diff) | |
download | postgresql-72bd38cc99a15da6f97373fae98027c908c398ea.tar.gz postgresql-72bd38cc99a15da6f97373fae98027c908c398ea.zip |
Transform OR clauses to ANY expression
Replace (expr op C1) OR (expr op C2) ... with expr op ANY(ARRAY[C1, C2, ...])
on the preliminary stage of optimization when we are still working with the
expression tree.
Here Cn is a n-th constant expression, 'expr' is non-constant expression, 'op'
is an operator which returns boolean result and has a commuter (for the case
of reverse order of constant and non-constant parts of the expression,
like 'Cn op expr').
Sometimes it can lead to not optimal plan. This is why there is a
or_to_any_transform_limit GUC. It specifies a threshold value of length of
arguments in an OR expression that triggers the OR-to-ANY transformation.
Generally, more groupable OR arguments mean that transformation will be more
likely to win than to lose.
Discussion: https://postgr.es/m/567ED6CA.2040504%40sigaev.ru
Author: Alena Rybakina <lena.ribackina@yandex.ru>
Author: Andrey Lepikhov <a.lepikhov@postgrespro.ru>
Reviewed-by: Peter Geoghegan <pg@bowt.ie>
Reviewed-by: Ranier Vilela <ranier.vf@gmail.com>
Reviewed-by: Alexander Korotkov <aekorotkov@gmail.com>
Reviewed-by: Robert Haas <robertmhaas@gmail.com>
Reviewed-by: Jian He <jian.universality@gmail.com>
Diffstat (limited to 'src/backend/utils/misc/guc_tables.c')
-rw-r--r-- | src/backend/utils/misc/guc_tables.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.c index 7d4e4387cf5..f9bb2b0f9e5 100644 --- a/src/backend/utils/misc/guc_tables.c +++ b/src/backend/utils/misc/guc_tables.c @@ -3657,6 +3657,18 @@ struct config_int ConfigureNamesInt[] = NULL, NULL, NULL }, + { + {"or_to_any_transform_limit", PGC_USERSET, QUERY_TUNING_OTHER, + gettext_noop("Set the minimum length of the list of OR clauses to attempt the OR-to-ANY transformation."), + gettext_noop("Once the limit is reached, the planner will try to replace expression like " + "'x=c1 OR x=c2 ..' to the expression 'x = ANY(ARRAY[c1,c2,..])'"), + GUC_EXPLAIN + }, + &or_to_any_transform_limit, + 5, -1, INT_MAX, + NULL, NULL, NULL + }, + /* End-of-list marker */ { {NULL, 0, 0, NULL, NULL}, NULL, 0, 0, 0, NULL, NULL, NULL |