Skip to content

Commit 9233624

Browse files
committed
Clamp total-tuples estimates for foreign tables to ensure planner sanity.
After running GetForeignRelSize for a foreign table, adjust rel->tuples to be at least as large as rel->rows. This prevents bizarre behavior in estimate_num_groups() and perhaps other places, especially in the scenario where rel->tuples is zero because pg_class.reltuples is (suggesting that ANALYZE has never been run for the table). As things stood, we'd end up estimating one group out of any GROUP BY on such a table, whereas the default group-count estimate is more likely to result in a sane plan. Also, clarify in the documentation that GetForeignRelSize has the option to override the rel->tuples value if it has a better idea of what to use than what is in pg_class.reltuples. Per report from Jeff Janes. Back-patch to all supported branches. Patch by me; thanks to Etsuro Fujita for review Discussion: https://postgr.es/m/CAMkU=1xNo9cnan+Npxgz0eK7394xmjmKg-QEm8wYG9P5-CcaqQ@mail.gmail.com
1 parent cfe89f5 commit 9233624

File tree

2 files changed

+11
-0
lines changed

2 files changed

+11
-0
lines changed

doc/src/sgml/fdwhandler.sgml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,14 @@ GetForeignRelSize(PlannerInfo *root,
123123
should be replaced if at all possible. The function may also choose to
124124
update <literal>baserel-&gt;width</literal> if it can compute a better estimate
125125
of the average result row width.
126+
(The initial value is based on column data types and on column
127+
average-width values measured by the last <command>ANALYZE</command>.)
128+
Also, this function may update <literal>baserel-&gt;tuples</literal> if
129+
it can compute a better estimate of the foreign table's total row count.
130+
(The initial value is
131+
from <structname>pg_class</structname>.<structfield>reltuples</structfield>
132+
which represents the total row count seen by the
133+
last <command>ANALYZE</command>.)
126134
</para>
127135

128136
<para>

src/backend/optimizer/path/allpaths.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -911,6 +911,9 @@ set_foreign_size(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
911911

912912
/* ... but do not let it set the rows estimate to zero */
913913
rel->rows = clamp_row_est(rel->rows);
914+
915+
/* also, make sure rel->tuples is not insane relative to rel->rows */
916+
rel->tuples = Max(rel->tuples, rel->rows);
914917
}
915918

916919
/*

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy