pgsql: Fix rowcount estimate for SubqueryScan that's under a Gather.

Поиск
Список
Период
Сортировка
От Tom Lane
Тема pgsql: Fix rowcount estimate for SubqueryScan that's under a Gather.
Дата
Msg-id E1nmJzb-002XkJ-7d@gemulon.postgresql.org
обсуждение исходный текст
Список pgsql-committers
Fix rowcount estimate for SubqueryScan that's under a Gather.

SubqueryScan was always getting labeled with a rowcount estimate
appropriate for non-parallel cases.  However, nodes that are
underneath a Gather should be treated as processing only one
worker's share of the rows, whether the particular node is explicitly
parallel-aware or not.  Most non-scan-level node types get this
right automatically because they base their rowcount estimate on
that of their input sub-Path(s).  But SubqueryScan didn't do that,
instead using the whole-relation rowcount estimate as if it were
a non-parallel-aware scan node.  If there is a parallel-aware node
below the SubqueryScan, this is wrong, and it results in inflating
the cost estimates for nodes above the SubqueryScan, which can cause
us to not choose a parallel plan, or choose a silly one --- as indeed
is visible in the one regression test whose results change with this
patch.  (Although that plan tree appears to contain no SubqueryScans,
there were some in it before setrefs.c deleted them.)

To fix, use path->subpath->rows not baserel->tuples as the number
of input tuples we'll process.  This requires estimating the quals'
selectivity afresh, which is slightly annoying; but it shouldn't
really add much cost thanks to the caching done in RestrictInfo.

This is pretty clearly a bug fix, but I'll refrain from back-patching
as people might not appreciate plan choices changing in stable branches.
The fact that it took us this long to identify the bug suggests that
it's not a major problem.

Per report from bucoo, though this is not his proposed patch.

Discussion: https://postgr.es/m/202204121457159307248@sohu.com

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/c40ba5f318f96a6a5a29729b987ead11c5dc65c1

Modified Files
--------------
src/backend/optimizer/path/costsize.c          | 22 ++++++++++++++++++----
src/test/regress/expected/incremental_sort.out | 10 ++++------
2 files changed, 22 insertions(+), 10 deletions(-)


В списке pgsql-committers по дате отправления:

Предыдущее
От: Peter Eisentraut
Дата:
Сообщение: pgsql: Remove JsonPathSpec typedef
Следующее
От: Andres Freund
Дата:
Сообщение: pgsql: Fix timing issue in deadlock recovery conflict test.