Re: Removing INNER JOINs

Поиск
Список
Период
Сортировка
От Andres Freund
Тема Re: Removing INNER JOINs
Дата
Msg-id 20141203162317.GA27550@alap3.anarazel.de
обсуждение исходный текст
Ответ на Re: Removing INNER JOINs  (Robert Haas <robertmhaas@gmail.com>)
Ответы Re: Removing INNER JOINs  (Robert Haas <robertmhaas@gmail.com>)
Список pgsql-hackers
On 2014-12-03 11:11:49 -0500, Robert Haas wrote:
> On Wed, Dec 3, 2014 at 10:56 AM, Andres Freund <andres@2ndquadrant.com> wrote:
> > On 2014-12-03 10:51:19 -0500, Robert Haas wrote:
> >> On Wed, Dec 3, 2014 at 4:29 AM, David Rowley <dgrowleyml@gmail.com> wrote:
> >> > *** Method 1: Removing Inner Joins at planning time:
> >> >
> >> > *** Method 2: Marking scans as possibly skippable during planning, and
> >> > skipping joins at execution (Andres' method)
> >> >
> >> > *** Method 3: Marking scans as possibly skippable during planning and
> >> > removing redundant join nodes at executor startup (Simon's method)
> >> [....]
> >> > a. can we invoke the planner during executor init?
> >>
> >> I'm pretty sure that we can't safely invoke the planner during
> >> executor startup, and that doing surgery on the plan tree (option #3)
> >> is unsafe also.  I'm pretty clear why the latter is unsafe: it might
> >> be a copy of a data structure that's going to be reused.
> >
> > We already have a transformation between the plan and execution
> > tree.
> 
> We do?
> 
> I think what we have is a plan tree, which is potentially stored in a
> plan cache someplace and thus must be read-only, and a planstate tree,
> which contains the stuff that is for this specific execution.  There's
> probably some freedom to do exciting things in the planstate nodes,
> but I don't think you can tinker with the plan itself.

Well, the planstate tree is what determines the execution, right? I
don't see what would stop us from doing something like replacing:
PlanState *
ExecInitNode(Plan *node, EState *estate, int eflags)
{
...       case T_NestLoop:           result = (PlanState *) ExecInitNestLoop((NestLoop *) node,
                         estate, eflags);
 
by       case T_NestLoop:                       if (JoinCanBeSkipped(node))                           result =
NonSkippedJoinNode(node);                      else                           result = (PlanState *)
ExecInitNestLoop((NestLoop*) node,                                                   estate, eflags);
 

Where JoinCanBeSkipped() and NonSkippedJoinNode() contain the logic
from David's early patch where he put the logic entirely into the actual
execution phase.

We'd probably want to move the join nodes into a separate ExecInitJoin()
function and do the JoinCanBeSkipped() and NonSkippedJoin() node in the
generic code.

Greetings,

Andres Freund

-- Andres Freund                       http://www.2ndQuadrant.com/PostgreSQL Development, 24x7 Support, Training &
Services



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

Предыдущее
От: Stephen Frost
Дата:
Сообщение: Re: On partitioning
Следующее
От: Stephen Frost
Дата:
Сообщение: Re: Removing INNER JOINs