Re: Memoize ANTI and SEMI JOIN inner
От | Alena Rybakina |
---|---|
Тема | Re: Memoize ANTI and SEMI JOIN inner |
Дата | |
Msg-id | 32524cd6-d069-476a-9989-76d7c695701b@postgrespro.ru обсуждение исходный текст |
Ответ на | Re: Memoize ANTI and SEMI JOIN inner (David Rowley <dgrowleyml@gmail.com>) |
Список | pgsql-hackers |
On 31.03.2025 06:33, David Rowley wrote: > On Mon, 31 Mar 2025 at 16:21, Alena Rybakina <a.rybakina@postgrespro.ru> wrote: >> However, is it necessary to check that extra->inner_unique must be false for SEMI/ANTI joins here, or am I missing something?It looks a little confusing at this point. > If it is necessary, I don't see the reason for it. It was me that > worked on unique joins and I see no reason why a SEMI or ANTI join > couldn't be marked as unique. The reason they're not today is that the > only point of the unique join optimisation is so that during > execution, the join nodes could skip to the next outer tuple after > matching the current outer to an inner. If the join is unique, then > there are no more join partners to find for the current outer after > matching it up once. With SEMI and ANTI joins, we skip to the next > outer tuple after finding a match anyway, so there's no point in going > to the trouble of setting the inner_unique flag. > > I can't say definitively that we won't find a reason in the future > that we should set inner_unique for SEMI/ANTI joins, so I don't follow > the need for the Assert. > > Maybe you're seeing something that I'm not. What do you think will > break if both flags are true? > Actually, I was mainly confused by the code itself - the check seemed to contradict the explanation. It looked like we were enforcing that inner_unique must be false for SEMI/ANTI joins, even though it's not actually important for those join types. That’s why I originally proposed either adding an Assert or removing this flag from check altogether, just to make it more explicit. So, I agree with your explanation — by the definition of SEMI and ANTI joins, there's no need to set inner_unique, and also no need to assert against it. These joins skip to the next outer tuple once they find a match (or fail to find one, in the case of ANTI). I updated the diff, where I left changes only in the code comment. -- Regards, Alena Rybakina Postgres Professional
Вложения
В списке pgsql-hackers по дате отправления: