Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitef799bd

Browse files
committed
Clamp total-tuples estimates for foreign tables to ensure planner sanity.
After running GetForeignRelSize for a foreign table, adjust rel->tuplesto be at least as large as rel->rows. This prevents bizarre behaviorin estimate_num_groups() and perhaps other places, especially in thescenario where rel->tuples is zero because pg_class.reltuples is(suggesting that ANALYZE has never been run for the table). As thingsstood, we'd end up estimating one group out of any GROUP BY on such atable, whereas the default group-count estimate is more likely to resultin a sane plan.Also, clarify in the documentation that GetForeignRelSize has the optionto override the rel->tuples value if it has a better idea of what to usethan 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 reviewDiscussion:https://postgr.es/m/CAMkU=1xNo9cnan+Npxgz0eK7394xmjmKg-QEm8wYG9P5-CcaqQ@mail.gmail.com
1 parent79ed1d9 commitef799bd

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
@@ -856,6 +856,9 @@ set_foreign_size(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
856856

857857
/* ... but do not let it set the rows estimate to zero */
858858
rel->rows=clamp_row_est(rel->rows);
859+
860+
/* also, make sure rel->tuples is not insane relative to rel->rows */
861+
rel->tuples=Max(rel->tuples,rel->rows);
859862
}
860863

861864
/*

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp