I have a query:
FROM objects_hier oh
oh.id < 2000 (!)
oh.id in (
SELECT id as id FROM objects_access oa
oa.master IN (1,2,10001)
oa.id < 2000 (!)
The sense of the query is simple: I choose ids from
objects_hier where access has necessary masters.
The problem is: I have duplicate conditions for id
here. They are marked with ‘!’.
I just can’t remove any of them, because planner
needs to estimate both outer and inner selects to calculate the order
Of nested loop or choose a join. If I remove one of duplicate
conditions – planner can’t estimate well.
It’s obvious that condition on oh.id can be put
inside or outside “oh.id in ( .. )” statement with same result.
So I just suggest that the planner should take this
into account and “propagate” the condition outside or inside for
planning if needed.
Is there a way to fix this particular query? Usually
oh.id condition is not like <2000, but an inner join.
- [PERFORM] Planner improvement suggestion Ilia Kantor