Re: Foreign join pushdown vs EvalPlanQual

Поиск
Список
Период
Сортировка
От Etsuro Fujita
Тема Re: Foreign join pushdown vs EvalPlanQual
Дата
Msg-id 565EA539.1080703@lab.ntt.co.jp
обсуждение исходный текст
Ответ на Re: Foreign join pushdown vs EvalPlanQual  (Robert Haas <robertmhaas@gmail.com>)
Список pgsql-hackers
On 2015/12/02 1:53, Robert Haas wrote:
> On Fri, Nov 27, 2015 at 1:33 AM, Etsuro Fujita
> <fujita.etsuro@lab.ntt.co.jp> wrote:         Plan       *plan =
> &node->scan.plan;
>> @@ -3755,7 +3763,7 @@ make_foreignscan(List *qptlist,
>>          /* cost will be filled in by create_foreignscan_plan */
>>          plan->targetlist = qptlist;
>>          plan->qual = qpqual;
>> -       plan->lefttree = NULL;
>> +       plan->lefttree = fdw_outerplan;
>>          plan->righttree = NULL;
>>          node->scan.scanrelid = scanrelid;
>>
>> I think that that would break the EXPLAIN output.

> In what way?  EXPLAIN recurses into the left and right trees of every
> plan node regardless of what type it is, so superficially I feel like
> this ought to just work. What problem do you foresee?
>
> I do think that ExecInitForeignScan ought to be changed to
> ExecInitNode on it's outer plan if present rather than leaving that to
> the FDW's BeginForeignScan method.

IIUC, I think the EXPLAIN output for eg,

select localtab.* from localtab, ft1, ft2 where localtab.a = ft1.a and 
ft1.a = ft2.a for update

would be something like this:
 LockRows   ->  Nested Loop         Join Filter: (ft1.a = localtab.a)         ->  Seq Scan on localtab         ->
ForeignScan on ft1/ft2-foreign-join               -> Nested Loop                    Join Filter: (ft1.a = ft2.a)
           ->  Foreign Scan on ft1                    ->  Foreign Scan on ft2
 

The subplan below the Foreign Scan on the foreign-join seems odd to me.  One option to avoid that is to handle the
subplanas in my patch [2], 
 
which I created to address your comment that we should not break the 
equivalence discussed below.  I'm not sure that the patch's handling of 
chgParam for the subplan is a good idea, though.

>> One option to avoid that
>> is to set the fdw_outerplan in ExecInitForeignScan as in my patch [1], or
>> BeginForeignScan as you proposed.  That breaks the equivalence that the Plan
>> tree and the PlanState tree should be mirror images of each other, but I
>> think that that break would be harmless.

> I'm not sure how many times I have to say this, but we are not doing
> that.  I will not commit any patch that does that, and I will
> vigorously argue against anyone else committing such a patch either.
> That *would* break EXPLAIN, because EXPLAIN relies on being able to
> walk the PlanState tree and find all the Plan nodes from the
> corresponding PlanState nodes.  Now you might think that it would be
> OK to omit a plan node that we decided we weren't ever going to
> execute, but today we don't do that, and I don't think we should.  I
> think it could be very confusing if EXPLAIN and EXPLAIN ANALYZE show
> different sets of plan nodes for the same query.  Quite apart from
> EXPLAIN, there are numerous other places that assume that they can
> walk the PlanState tree and find all the Plan nodes.  Breaking that
> assumption would be bad news.

Agreed.  Thanks for the explanation!

Best regards,
Etsuro Fujita

[2] http://www.postgresql.org/message-id/5624D583.10202@lab.ntt.co.jp





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

Предыдущее
От: Michael Paquier
Дата:
Сообщение: Re: Declarative partitioning
Следующее
От: Etsuro Fujita
Дата:
Сообщение: Re: Foreign join pushdown vs EvalPlanQual