On Fri, Sep 14, 2018 at 3:58 PM, Amit Langote <langote_amit...@lab.ntt.co.jp> wrote: > Thanks a lot for your detailed review. > I was going through your patch (v3-0002) and I have some suggestions
1. - if (nparts > 0) + /* + * For partitioned tables, we just allocate space for RelOptInfo's. + * pointers for all partitions and copy the partition OIDs from the + * relcache. Actual RelOptInfo is built for a partition only if it is + * not pruned. + */ + if (rte->relkind == RELKIND_PARTITIONED_TABLE) + { rel->part_rels = (RelOptInfo **) - palloc(sizeof(RelOptInfo *) * nparts); + palloc0(sizeof(RelOptInfo *) * rel->nparts); + return rel; + } I think we can delay allocating memory for rel->part_rels? And we can allocate in add_rel_partitions_to_query only for those partitions which survive pruning. 2. add_rel_partitions_to_query ... + /* Expand the PlannerInfo arrays to hold new partition objects. */ + num_added_parts = scan_all_parts ? rel->nparts : + bms_num_members(partindexes); + new_size = root->simple_rel_array_size + num_added_parts; + root->simple_rte_array = (RangeTblEntry **) + repalloc(root->simple_rte_array, + sizeof(RangeTblEntry *) * new_size); + root->simple_rel_array = (RelOptInfo **) + repalloc(root->simple_rel_array, + sizeof(RelOptInfo *) * new_size); + if (root->append_rel_array) + root->append_rel_array = (AppendRelInfo **) + repalloc(root->append_rel_array, + sizeof(AppendRelInfo *) * new_size); + else + root->append_rel_array = (AppendRelInfo **) + palloc0(sizeof(AppendRelInfo *) * + new_size); Instead of re-pallocing for every partitioned relation can't we first count the total number of surviving partitions and repalloc at once. 3. + /* + * And do prunin. Note that this adds AppendRelInfo's of only the + * partitions that are not pruned. + */ prunin/pruning -- Regards, Dilip Kumar EnterpriseDB: http://www.enterprisedb.com