> On 21 Mar 2024, at 23:42, Matthias van de Meent 
> <boekewurm+postg...@gmail.com> wrote:
> 
> On Tue, 19 Mar 2024 at 17:00, Michał Kłeczek <mic...@kleczek.org> wrote:
> 
>> With this operator we can write our queries like:
>> 
>> account_number ||= [list of account numbers] AND
>> account_number = ANY ([list of account numbers]) — redundant for partition 
>> pruning as it does not understand ||=
>> 
>> and have optimal plans:
>> 
>> Limit
>> — Merge Append
>> —— Index scan of relevant partitions
>> 
>> The problem is that now each partition scan is for the same list of accounts.
>> The “consistent” function cannot assume anything about contents of the table 
>> so it has to check all elements of the list
>> and that in turn causes reading unnecessary index pages for accounts not in 
>> this partition.
> 
> You seem to already be using your own operator class, so you may want
> to look into CREATE FUNCTION's support_function parameter; which would
> handle SupportRequestIndexCondition and/or SupportRequestSimplify.
> I suspect a support function that emits multiple clauses that each
> apply to only a single partition at a time should get you quite far if
> combined with per-partition constraints that filter all but one of
> those. Also, at plan-time you can get away with much more than at
> runtime.

Thanks for suggestion.

I am afraid I don’t understand how it might actually work though:

1) I think planning time is too early for us - we are heavily using 
planner_mode = force_generic_plan:
- we have many partitions and planning times started to dominate execution time
- generic plans are not worse than specialised

2) I am not sure how I could transform
"col ||= [array]" to multiple criteria to make sure it works well with 
partition pruning and planner.

It looks like what you are suggesting is to generate something like:
(part_condition AND col ||= [subarray1]) OR (part_condition AND col ||= 
[subarray2])
and hope the planner would generate proper Merge Append node (which I doubt 
would happen and planner would generate Bitmap scan due to lack of OR support 
in Gist).
What’s more - there is no part_condition for hash partitions.

> 
>> What we need is a way for the “consistent” function to be able to 
>> pre-process input query array and remove elements
>> that are not relevant for this scan. To do that it is necessary to have 
>> enough information to read necessary metadata from the catalog.
> 
>> The proposed patch addresses this need and seems (to me) largely 
>> uncontroversial as it does not break any existing extensions.
> 
> I don't think "my index operator class will go into the table
> definition and check if parts of the scankey are consistent with the
> table constraints" is a good reason to expose the index column to
> operator classes.

Quite possibly but I still don’t see any other way to do that TBH.

—
Michal



Reply via email to