Re: Declarative partitioning - another take
Amit Langote <langote_amit_f8@lab.ntt.co.jp>
On 2016/08/25 16:15, Ashutosh Bapat wrote: > On Thu, Aug 25, 2016 at 12:22 PM, Amit Langote wrote: >> b) >> when accumulating append subpaths, do not flatten a subpath that is itself >> an append when ((AppendPath *) subpath)->path.parent is a RelOptInfo with >> non-NULL partitioning info.Is the latter somehow necessary for >> pairwise-join considerations? > > I don't think you need to do anything in the path creation code for this. > As is it flattens all AppendPath hierarchies whether for partitioning or > inheritance or subqueries. We should leave it as it is. I thought it would be convenient for pairwise join code to work with the hierarchy intact even within the AppendPath tree. If it turns out to be so, maybe that patch can take care of it. >> I think I can manage to squeeze in (a) in the next version patch and will >> also start working on (b), mainly the part about RelOptInfo getting some >> partitioning info. > > I am fine with b, where you would include some partitioning information in > RelOptInfo. But you don't need to do what you said in (b) above. > > In a private conversation Robert Haas suggested a way slightly different > than what my patch for partition-wise join does. He suggested that the > partitioning schemes i.e strategy, number of partitions and bounds of the > partitioned elations involved in the query should be stored in PlannerInfo > in the form of a list. Each partitioning scheme is annotated with the > relids of the partitioned relations. RelOptInfo of the partitioned relation > will point to the partitioning scheme in PlannerInfo. Along-with that each > RelOptInfo will need to store partition keys for corresponding relation. > This simplifies matching the partitioning schemes of the joining relations. > Also it reduces the number of copies of partition bounds floating around as > we expect that a query will involve multiple partitioned tables following > similar partitioning schemes. May be you want to consider this idea while > working on (b). So IIUC, a partitioned relation's (baserel or joinrel) RelOptInfo has only the information about partition keys. They will be matched with query restriction quals pruning away any unneeded partitions which happens individually for each such parent baserel (within set_append_rel_size() I suppose). Further, two joining relations are eligible to be considered for pairwise joining if they have identical partition keys and query equi-join quals match the same. The resulting joinrel will have the same partition key (as either joining relation) and will have as many partitions as there are in the intersection of sets of partitions of joining rels (intersection proceeds by matching partition bounds). "Partition scheme" structs go into a PlannerInfo list member, one corresponding to each partitioned relation - baserel or joinrel, right? As you say, each such struct has the following pieces of information: strategy, num_partitions, bounds (and other auxiliary info). Before make_one_rel() starts, the list has one for each partitioned baserel. After make_one_rel() has formed baserel pathlists and before make_rel_from_joinlist() is called, are the partition scheme structs of processed baserels marked with some information about the pruning activity that occurred so far? Then as we build successively higher levels of joinrels, new entries will be made for those joinrels for which we added pairwise join paths, with relids matching the corresponding joinrels. Does that make sense? Thanks, Amit
Commits
-
Fix typo.
- 03bf59676ea0 10.0 landed
-
Document trigger-firing behavior for inheritance/partitioning.
- e17628145ac3 10.0 landed
-
Fire per-statement triggers on partitioned tables.
- e180c8aa8caf 10.0 landed
-
Set ecxt_scantuple correctly for tuple routing.
- 132488bfee68 10.0 landed
-
Fix interaction of partitioned tables with BulkInsertState.
- b1ecb9b3fcfb 10.0 landed
-
Avoid core dump for empty prepared statement in an aborted transaction.
- ba61a04bc7fe 10.0 cited
-
Fix some problems in check_new_partition_bound().
- 8a8afe2f54c2 10.0 landed
-
Remove unnecessary arguments from partitioning functions.
- 18fc5192a631 10.0 cited
-
Fix reporting of constraint violations for table partitioning.
- f1b4c771ea74 10.0 cited
-
Fix tuple routing in cases where tuple descriptors don't match.
- 2ac3ef7a01df 10.0 cited
-
Invalid parent's relcache after CREATE TABLE .. PARTITION OF.
- 7cd0fd655d68 10.0 landed
-
Doc: improve documentation about inheritance.
- 162477a63d3c 10.0 cited