From: | Richard Guo <guofenglinux(at)gmail(dot)com> |
---|---|
To: | PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Redundant Result node |
Date: | 2024-08-22 07:34:05 |
Message-ID: | CAMbWs48TosSvmnz88663_2yg3hfeOFss-J2PtnENDH6J_rLnRQ@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
I ran into a query plan where the Result node seems redundant to me:
create table t (a int, b int, c int);
insert into t select i%10, i%10, i%10 from generate_series(1,100)i;
create index on t (a, b);
analyze t;
set enable_hashagg to off;
set enable_seqscan to off;
explain (verbose, costs off)
select distinct b, a from t order by a, b;
QUERY PLAN
---------------------------------------------------------
Result
Output: b, a
-> Unique
Output: a, b
-> Index Only Scan using t_a_b_idx on public.t
Output: a, b
(6 rows)
What I expect is that both the Scan node and the Unique node output
'b, a', and we do not need an additional projection step, something
like:
explain (verbose, costs off)
select distinct b, a from t order by a, b;
QUERY PLAN
---------------------------------------------------
Unique
Output: b, a
-> Index Only Scan using t_a_b_idx on public.t
Output: b, a
(4 rows)
I looked into this a little bit and found that in function
create_ordered_paths, we decide whether a projection step is needed
based on a simple pointer comparison between sorted_path->pathtarget
and final_target.
/* Add projection step if needed */
if (sorted_path->pathtarget != target)
sorted_path = apply_projection_to_path(root, ordered_rel,
sorted_path, target);
This does not seem right to me, as PathTargets are not canonical, so
we cannot guarantee that two identical PathTargets will have the same
pointer. Actually, for the query above, the two PathTargets are
identical but have different pointers.
I wonder if we need to invent a function to compare two PathTargets.
Alternatively, in this case, would it suffice to simply compare
PathTarget.exprs?
Thanks
Richard
From | Date | Subject | |
---|---|---|---|
Next Message | Yugo NAGATA | 2024-08-22 07:59:47 | Re: Disallow USING clause when altering type of generated column |
Previous Message | Michael Paquier | 2024-08-22 07:33:54 | Re: [PATCH] Add additional extended protocol commands to psql: \parse and \bind |