Hi Ashutosh,

Long time no see!

On Thu, Feb 13, 2020 at 1:17 AM Ashutosh Bapat
<ashutosh.bapat....@gmail.com> wrote:
> In postgresGetForeignJoinPaths(), I see
>
>    /* Estimate costs for bare join relation */
>     estimate_path_cost_size(root, joinrel, NIL, NIL, NULL,
>                             &rows, &width, &startup_cost, &total_cost);
>     /* Now update this information in the joinrel */
>     joinrel->rows = rows;
>     joinrel->reltarget->width = width;
>
> This code is good as well as bad.
>
> For a join relation, we estimate the number of rows in 
> set_joinrel_size_estimates() inside build_*_join_rel() and set the width of 
> the join when building the targetlist. For foreign join, the size estimates 
> may not be correct but width estimate should be. So updating the number of 
> rows looks good since it would be better than what 
> set_joinrel_size_etimates() might come up with but here are the problems with 
> this code
> 1. The rows estimated by estimate_path_cost_size() are better only when 
> use_remote_estimates is true. So, we should be doing this only when 
> use_remote_estimate is true.

I think it's actually harmless to do that even when
use_remote_estimate=false because in that case we get the rows
estimate from joinrel->rows in estimate_path_cost_size() and return to
the caller the estimate as-is, IIRC.

> 2. This function gets called after local paths for the first pair for this 
> join have been added. So those paths are not being judged fairly and perhaps 
> we might be throwing away better paths just because the local estimates with 
> which they were created were very different from the remote estimates.

Yeah, but I'm not sure we really need to fix that because I think the
remote-join path would usually win against any of local-join paths.
Could you show me an example causing an issue?

Best regards,
Etsuro Fujita


Reply via email to