From: | Andrei Lepikhov <lepihov(at)gmail(dot)com> |
---|---|
To: | Richard Guo <guofenglinux(at)gmail(dot)com> |
Cc: | PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org>, David Rowley <dgrowleyml(at)gmail(dot)com>, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
Subject: | Re: Check lateral references within PHVs for memoize cache keys |
Date: | 2024-06-28 14:14:53 |
Message-ID: | a19ac195-0dd9-43f1-94a8-8ab39e48dab7@gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
On 6/18/24 08:47, Richard Guo wrote:
> On Mon, Mar 18, 2024 at 4:36 PM Richard Guo <guofenglinux(at)gmail(dot)com> wrote:
>> Here is another rebase over master so it applies again. I also added a
>> commit message to help review. Nothing else has changed.
>
> AFAIU currently we do not add Memoize nodes on top of join relation
> paths. This is because the ParamPathInfos for join relation paths do
> not maintain ppi_clauses, as the set of relevant clauses varies
> depending on how the join is formed. In addition, joinrels do not
> maintain lateral_vars. So we do not have a way to extract cache keys
> from joinrels.
>
> (Besides, there are places where the code doesn't cope with Memoize path
> on top of a joinrel path, such as in get_param_path_clause_serials.)
>
> Therefore, when extracting lateral references within PlaceHolderVars,
> there is no need to consider those that are due to be evaluated at
> joinrels.
>
> Hence, here is v7 patch for that. In passing, this patch also includes
> a comment explaining that Memoize nodes are currently not added on top
> of join relation paths (maybe we should have a separate patch for this?).
Hi,
I have reviewed v7 of the patch. This improvement is good enough to be
applied, thought. Here is some notes:
Comment may be rewritten for clarity:
"Determine if the clauses in param_info and innerrel's lateral_vars" -
I'd replace lateral_vars with 'lateral references' to combine in one
phrase PHV from rel and root->placeholder_list sources.
I wonder if we can add whole PHV expression instead of the Var (as
discussed above) just under some condition:
if (!bms_intersect(pull_varnos(root, (Node *) phinfo->ph_var->phexpr),
innerrelids))
{
// Add whole PHV
}
else
{
// Add only pulled vars
}
I got the point about Memoize over join, but as a join still calls
replace_nestloop_params to replace parameters in its clauses, why not to
invent something similar to find Memoize keys inside specific JoinPath
node? It is not the issue of this patch, though - but is it doable?
IMO, the code:
if (bms_nonempty_difference(outerPlan->chgParam, node->keyparamids))
cache_purge_all(node);
is a good place to check an assertion: is it really the parent query
parameters that make a difference between memoize keys and node list of
parameters?
Generally, this patch looks good for me to be committed.
--
regards, Andrei Lepikhov
From | Date | Subject | |
---|---|---|---|
Next Message | Robert Haas | 2024-06-28 15:46:24 | Re: On disable_cost |
Previous Message | Alexander Lakhin | 2024-06-28 14:00:00 | Re: Why is infinite_recurse test suddenly failing? |