Re: Ordered Partitioned Table Scans - Mailing list pgsql-hackers
From | David Rowley |
---|---|
Subject | Re: Ordered Partitioned Table Scans |
Date | |
Msg-id | CAKJS1f8czVTx28osO0Ty6iJwTggiZmfFyMWF1an3W=8btR2AZQ@mail.gmail.com Whole thread Raw |
In response to | Re: Ordered Partitioned Table Scans (Antonin Houska <ah@cybertec.at>) |
Responses |
Re: Ordered Partitioned Table Scans
|
List | pgsql-hackers |
On 1 November 2018 at 22:05, Antonin Houska <ah@cybertec.at> wrote: > I think these conditions are too restrictive: > > /* > * Determine if these pathkeys match the partition order, or reverse > * partition order. It can't match both, so only go to the trouble of > * checking the reverse order when it's not in ascending partition > * order. > */ > partition_order = pathkeys_contained_in(pathkeys, > partition_pathkeys); > partition_order_desc = !partition_order && > pathkeys_contained_in(pathkeys, > partition_pathkeys_desc); > > > In the example above I wanted to show that your new feature should work even > if "pathkeys" is not contained in "partition_pathkeys". Okay, after a bit more time looking at this I see what you're saying now and I agree, but; see below. >> > Another problem I see is that build_partition_pathkeys() continues even if it >> > fails to create a pathkey for some partitioning column. In the example above >> > it would mean that the table can have "partition_pathkeys" equal to {j} >> > instead of {i, j} on some EC-related conditions. However such a key does not >> > correspond to reality - this is easier to imagine if another partition is >> > considered. >> > >> > partition 3: >> > >> > i | j | k >> > ---+---+--- >> > 1 | 0 | 1 >> > 1 | 0 | 0 >> > >> > So I think no "partition_pathkeys" should be generated in that case. On the >> > other hand, if the function returned the part of the list it could construct >> > so far, it'd be wrong because such incomplete pathkeys could pass the checks I >> > proposed above for reasons unrelated to the partitioning scheme. >> >> Oops. That's a mistake. We should return what we have so far if we >> can't make one of the pathkeys. Will fix. > > I think no "partition_pathkeys" should be created in this case, but before we > can discuss this in detail there needs to be an agreement on the evaluation of > the relationship between "pathkeys" and "partition_pathkeys", see above. The problem with doing that is that if the partition keys are better than the pathkeys then we'll most likely fail to generate any partition keys at all due to lack of any existing eclass to use for the pathkeys. It's unsafe to use just the prefix in this case as the eclass may not have been found due to, for example one of the partition keys having a different collation than the required sort order of the query. In other words, we can't rely on a failure to create the pathkey meaning that a more strict sort order is not required. I'm a bit unsure on how safe it would be to pass "create_it" as true to make_pathkey_from_sortinfo(). We might be building partition path keys for some sub-partitioned table. In this case the eclass should likely have a its member added with em_is_child = true. The existing code always sets em_is_child to false. It's not that clear to me that setting up a new eclass with a single em_is_child = true member is correct. -- David Rowley http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services
pgsql-hackers by date: