Re: BUG #18234: Nested Loop joint strategy is ignored for a tiny table joined with UNION ALL of two filtered parts
От | Tom Lane |
---|---|
Тема | Re: BUG #18234: Nested Loop joint strategy is ignored for a tiny table joined with UNION ALL of two filtered parts |
Дата | |
Msg-id | 1320817.1701985987@sss.pgh.pa.us обсуждение исходный текст |
Ответ на | BUG #18234: Nested Loop joint strategy is ignored for a tiny table joined with UNION ALL of two filtered parts (PG Bug reporting form <noreply@postgresql.org>) |
Ответы |
Re: BUG #18234: Nested Loop joint strategy is ignored for a tiny table joined with UNION ALL of two filtered parts
|
Список | pgsql-bugs |
PG Bug reporting form <noreply@postgresql.org> writes: > Summary of the issue: for a (5-row recordset) JOIN (massive partitioned > recordset indexed by id) USING (id), the (Nested Loop over 5 values) > strategy is completely ignored, and Hash Join or Merge Join is done instead, > which does SeqScan over the "massive recordset". > Reproduction in DB Fiddle: > https://www.db-fiddle.com/f/sJUUWNgW7pqPWcJwihVoj5/1 (this demonstrates both > the bad behaviour and a way to work around it) We are generally not too happy with non-self-contained bug reports. Once that DB Fiddle entry disappears, this bug report will be useless. However ... > 1)The massive recordset on the right side of the JOIN must come from the > UNION ALL of two parts, both of which have a filter, like this view in my > reproduction: > create view vw_broken as > select id from huge where filter_out > union all > select id from medium where filter_out; I suspect the WHERE clauses trigger the problem because the resulting sub-selects can't be pulled up to become an "appendrel", per is_safe_append_member: * It's only safe to pull up the child if its jointree contains exactly * one RTE, else the AppendRelInfo data structure breaks. The one base RTE * could be buried in several levels of FromExpr, however. Also, if the * child's jointree is completely empty, we can pull up because * pull_up_simple_subquery will insert a single RTE_RESULT RTE instead. * * Also, the child can't have any WHERE quals because there's no place to * put them in an appendrel. (This is a bit annoying...) That means the sub-selects will be planned independently and there's no chance to consider the nestloop-with-inner-indexscan plan you are hoping for. This is a longstanding wart, but improving matters would require some fairly painstaking work. The "appendrel" mechanism is core to both traditional inheritance and partitioning; I don't recommend trying to blow it up and start over. I vaguely recall previous discussions that identified some semantic issues with trying to just attach WHERE clauses to appendrel members, but it was a long time ago and the details escape me. regards, tom lane
В списке pgsql-bugs по дате отправления: