Re: Removing unneeded self joins - Mailing list pgsql-hackers

From Zhihong Yu
Subject Re: Removing unneeded self joins
Date
Msg-id CALNJ-vSS-bWvNEacBhKtEcVhoBA_trPEHGMHKB_gaeeC4_=v2A@mail.gmail.com
Whole thread Raw
In response to Re: Removing unneeded self joins  (Zhihong Yu <zyu@yugabyte.com>)
Responses Re: Removing unneeded self joins  ("Andrey V. Lepikhov" <a.lepikhov@postgrespro.ru>)
List pgsql-hackers


On Thu, Jul 15, 2021 at 8:25 AM Zhihong Yu <zyu@yugabyte.com> wrote:


On Thu, Jul 15, 2021 at 7:49 AM Andrey Lepikhov <a.lepikhov@postgrespro.ru> wrote:
On 6/7/21 13:49, Hywel Carver wrote:
> On Mon, Jul 5, 2021 at 2:20 PM Andrey Lepikhov
> <a.lepikhov@postgrespro.ru <mailto:a.lepikhov@postgrespro.ru>> wrote:
> Looking through the email chain, a previous version of this patch added
> ~0.6% to planning time in the worst case tested - does that meet the
> "essentially free" requirement?
I think these tests weren't full coverage of possible use cases. It will
depend on a number of relations in the query. For the JOIN of
partitioned tables, for example, the overhead could grow. But in the
context of overall planning time this overhead will be small till the
large number of relations.
Also, we made this feature optional to solve possible problems.
Rebased on 768ea9bcf9

--
regards,
Andrey Lepikhov
Postgres Professional
Hi,

bq. We can proof the uniqueness

proof -> prove

1. Collect all mergejoinable join quals looks like a.x = b.x

 quals looks like -> quals which look like

For update_ec_sources(), the variable cc is not used.

Cheers
Hi,

+   *otherjoinquals = rjoinquals;

Maybe rename rjoinquals as ojoinquals to align with the target variable name.

+   int k; /* Index of kept relation */
+   int r = -1; /* Index of removed relation */

Naming k as kept, r as removed would make the code more readable (remain starts with r but has opposite meaning).

+               if (bms_is_member(r, info->syn_righthand) &&
+                   !bms_is_member(k, info->syn_righthand))
+                   jinfo_check = false;
+
+               if (!jinfo_check)
+                   break;

There are 4 if statements where jinfo_check is assigned false. Once jinfo_check is assigned, we can break out of the loop - instead of checking the remaining conditions.

+           else if (!innerrel_is_unique(root, joinrelids, outer->relids,

nit: the 'else' is not needed since the if block above it goes to next iteration of the loop.

+           /* See for row marks. */
+           foreach (lc, root->rowMarks)

It seems once imark and omark are set, we can come out of the loop.

Cheers

pgsql-hackers by date:

Previous
From: "Jonathan S. Katz"
Date:
Subject: Re: unnesting multirange data types
Next
From: Dean Rasheed
Date:
Subject: Re: CREATE COLLATION - check for duplicate options and error out if found one