Fix tuple_fraction calculation in generate_orderedappend_paths()
6b94e7a6da adjusted generate_orderedappend_paths() to consider fractional paths. However, it didn't manage to interpret the tuple_fraction value correctly. According to the header comment of grouping_planner(), the tuple_fraction >= 1 specifies the absolute number of expected tuples. That number must be divided by the expected total number of tuples to get the actual fraction. Even though this is a bug fix, we don't backpatch it. The risks of the side effects of plan changes on stable branches are too high. Reported-by: Andrei Lepikhov <lepihov@gmail.com> Discussion: https://postgr.es/m/3ca271fa-ca5c-458c-8934-eb148622b270%40gmail.com Author: Andrei Lepikhov <lepihov@gmail.com> Reviewed-by: Junwang Zhao <zhjwpku@gmail.com> Reviewed-by: Alvaro Herrera <alvherre@alvh.no-ip.org> Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
This commit is contained in:
parent
12eee85e51
commit
3d3a81fc24
@ -1891,7 +1891,17 @@ generate_orderedappend_paths(PlannerInfo *root, RelOptInfo *rel,
|
||||
*/
|
||||
if (root->tuple_fraction > 0)
|
||||
{
|
||||
double path_fraction = (1.0 / root->tuple_fraction);
|
||||
double path_fraction = root->tuple_fraction;
|
||||
|
||||
/*
|
||||
* Merge Append considers only live children relations. Dummy
|
||||
* relations must be filtered out before.
|
||||
*/
|
||||
Assert(childrel->rows > 0);
|
||||
|
||||
/* Convert absolute limit to a path fraction */
|
||||
if (path_fraction >= 1.0)
|
||||
path_fraction /= childrel->rows;
|
||||
|
||||
cheapest_fractional =
|
||||
get_cheapest_fractional_path_for_pathkeys(childrel->pathlist,
|
||||
|
@ -5260,6 +5260,24 @@ SELECT x.id, y.id FROM fract_t x LEFT JOIN fract_t y USING (id) ORDER BY x.id DE
|
||||
Index Cond: (id = x_2.id)
|
||||
(11 rows)
|
||||
|
||||
EXPLAIN (COSTS OFF) -- Should use NestLoop with parameterised inner scan
|
||||
SELECT x.id, y.id FROM fract_t x LEFT JOIN fract_t y USING (id)
|
||||
ORDER BY x.id DESC LIMIT 2;
|
||||
QUERY PLAN
|
||||
--------------------------------------------------------------------------------
|
||||
Limit
|
||||
-> Merge Append
|
||||
Sort Key: x.id DESC
|
||||
-> Nested Loop Left Join
|
||||
-> Index Only Scan Backward using fract_t0_pkey on fract_t0 x_1
|
||||
-> Index Only Scan using fract_t0_pkey on fract_t0 y_1
|
||||
Index Cond: (id = x_1.id)
|
||||
-> Nested Loop Left Join
|
||||
-> Index Only Scan Backward using fract_t1_pkey on fract_t1 x_2
|
||||
-> Index Only Scan using fract_t1_pkey on fract_t1 y_2
|
||||
Index Cond: (id = x_2.id)
|
||||
(11 rows)
|
||||
|
||||
--
|
||||
-- Test Append's fractional paths
|
||||
--
|
||||
|
@ -1224,6 +1224,9 @@ SELECT x.id, y.id FROM fract_t x LEFT JOIN fract_t y USING (id) ORDER BY x.id AS
|
||||
|
||||
EXPLAIN (COSTS OFF)
|
||||
SELECT x.id, y.id FROM fract_t x LEFT JOIN fract_t y USING (id) ORDER BY x.id DESC LIMIT 10;
|
||||
EXPLAIN (COSTS OFF) -- Should use NestLoop with parameterised inner scan
|
||||
SELECT x.id, y.id FROM fract_t x LEFT JOIN fract_t y USING (id)
|
||||
ORDER BY x.id DESC LIMIT 2;
|
||||
|
||||
--
|
||||
-- Test Append's fractional paths
|
||||
|
Loading…
x
Reference in New Issue
Block a user