Skip to content

Commit

Permalink
ysql: Import Reduce the cost of planning deeply-nested views.
Browse files Browse the repository at this point in the history
Summary:
Upstream commit was 64919aaab45076445051245c9bcd48dd84abebe7

Commit message:

    Joel Jacobson reported that deep nesting of trivial (flattenable)
    views results in O(N^3) growth of planning time for N-deep nesting.
    It turns out that a large chunk of this cost comes from copying around
    the "subquery" sub-tree of each view's RTE_SUBQUERY RTE.  But once we
    have successfully flattened the subquery, we don't need that anymore,
    because the planner isn't going to do anything else interesting with
    that RTE.  We already zap the subquery pointer during setrefs.c (cf.
    add_rte_to_flat_rtable), but it's useless baggage earlier than that
    too.  Clearing the pointer as soon as pull_up_simple_subquery is done
    with the RTE reduces the cost from O(N^3) to O(N^2); which is still
    not great, but it's quite a lot better.  Further improvements will
    require rethinking of the RTE data structure, which is being considered
    in another thread.

    Patch by me; thanks to Dean Rasheed for review.

    Discussion: https://postgr.es/m/797aff54-b49b-4914-9ff9-aa42564a4d7d@www.fastmail.com

Test Plan: Build Yugabyte DB and verify there is no test regression.

Reviewers: jason

Reviewed By: jason

Subscribers: yql

Differential Revision: https://phabricator.dev.yugabyte.com/D12187
  • Loading branch information
tedyu committed Jul 7, 2021
1 parent 11feb32 commit 9c6b8e6
Showing 1 changed file with 11 additions and 4 deletions.
15 changes: 11 additions & 4 deletions src/postgres/src/backend/optimizer/prep/prepjointree.c
Original file line number Diff line number Diff line change
Expand Up @@ -880,10 +880,9 @@ pull_up_simple_subquery(PlannerInfo *root, Node *jtnode, RangeTblEntry *rte,
ListCell *lc;

/*
* Need a modifiable copy of the subquery to hack on. Even if we didn't
* sometimes choose not to pull up below, we must do this to avoid
* problems if the same subquery is referenced from multiple jointree
* items (which can't happen normally, but might after rule rewriting).
* Make a modifiable copy of the subquery to hack on, so that the RTE will
* be left unchanged in case we decide below that we can't pull it up
* after all.
*/
subquery = copyObject(rte->subquery);

Expand Down Expand Up @@ -1211,6 +1210,14 @@ pull_up_simple_subquery(PlannerInfo *root, Node *jtnode, RangeTblEntry *rte,
Assert(root->placeholder_list == NIL);
Assert(subroot->placeholder_list == NIL);

/*
* We no longer need the RTE's copy of the subquery's query tree. Getting
* rid of it saves nothing in particular so far as this level of query is
* concerned; but if this query level is in turn pulled up into a parent,
* we'd waste cycles copying the now-unused query tree.
*/
rte->subquery = NULL;

/*
* Miscellaneous housekeeping.
*
Expand Down

0 comments on commit 9c6b8e6

Please sign in to comment.