Re: Redundant Result node

From: Richard Guo <guofenglinux(at)gmail(dot)com>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: Redundant Result node
Date: 2024-08-23 08:27:42
Message-ID: CAMbWs49zn0YiyadpfUUcZwHzePz+12cs5s4A+wW9ccVC28Rg1A@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Fri, Aug 23, 2024 at 11:56 AM Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> wrote:
> Richard Guo <guofenglinux(at)gmail(dot)com> writes:
> > I agree that it’s always desirable to postpone work from path-creation
> > time to plan-creation time. In this case, however, it’s a little
> > different. The projection step could actually be avoided from the
> > start if we perform the correct check in create_ordered_paths.
>
> Well, the question is how expensive is the "correct check" compared
> to what we're doing now. It might be cheaper than creating an extra
> level of path node, or it might not. An important factor here is
> that we'd pay the extra cost of a more complex check every time,
> whether it avoids creation of an extra path node or not.

Fair point. After looking at the code for a while, I believe it is
sufficient to compare PathTarget.exprs after we've checked that the
two targets have different pointers.

The sorted_path here should have projected the correct target required
by the preceding steps of sort, i.e. sort_input_target. We need to
determine whether this target matches final_target. If this target is
the same pointer as sort_input_target, a simple pointer comparison, as
the current code does, is sufficient, because if no post-sort
projection is needed, sort_input_target will always be equal to
final_target.

However, sorted_path's target might not be the same pointer as
sort_input_target, because in apply_scanjoin_target_to_paths, if the
target to be applied has the same expressions as the existing
reltarget, we only inject the sortgroupref info into the existing
pathtargets, rather than create projection paths. As a result,
pointer comparison in create_ordered_paths is not reliable.

Instead, we can compare PathTarget.exprs to determine whether a
projection step is needed. If the expressions match, we can be
confident that a post-sort projection is not required.

If this conclusion is correct, I think the extra cost of comparing
PathTarget.exprs only when pointer comparison fails should be
acceptable. We have already done this for
apply_scanjoin_target_to_paths, and I think the rationale there
applies here as well:

* ... By avoiding the creation of
* projection paths we save effort both immediately and at plan creation time.

Besides, it can help avoid a Result node in the final plan in some
cases, as shown by my initial example.

Hence, I propose the attached fix. There are two ensuing plan diffs
in the regression tests, but they look reasonable and are exactly what
we are fixing here.

Thanks
Richard

Attachment Content-Type Size
v1-0001-Avoid-unnecessary-post-sort-projection.patch application/octet-stream 2.7 KB

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message shawn wang 2024-08-23 08:53:58 Trim the heap free memory
Previous Message Bertrand Drouvot 2024-08-23 07:32:16 Re: Track IO times in pg_stat_io