Re: [HACKERS] path toward faster partition pruning
Robert Haas <robertmhaas@gmail.com>
On Fri, Feb 2, 2018 at 9:33 AM, Robert Haas <robertmhaas@gmail.com> wrote: >> Updated set of patches attached (patches 0002 onward mostly unchanged, >> except I incorporated the delta patch posted by David upthread). > > Committed 0001. Thanks. Some preliminary thoughts... Regarding 0002, I can't help noticing that this adds a LOT of new code to partition.c. With 0002 applied, it climbs into the top 2% of all ".c" files in terms of lines of code. It seems to me, though, that maybe it would make sense to instead add all of this code to some new file .c file, e.g. src/backend/optimizer/util/partprune.c. I realize that's a little awkward in this case because we're hoping to use this code at runtime and not just in the optimizer, but I don't have a better idea. Using src/backend/catalog as a dumping-ground for code that doesn't have a clear-cut place to live is not a superior alternative, for sure. And it seems to me that the code you're adding here is really quite similar to what we've already got in that directory -- for example, predtest.c, which currently does partition pruning, lives there; so does clauses.c, whose evaluate_expr facility this patch wants to use; so does relnode.c, which the other patches modify; and in general this looks an awful lot like other optimizer logic that decomposes clauses. I'm open to other suggestions but I don't think adding all of this directly into partition.c is a good plan. If we do add a new file for this code, the header comment for that file would be a good place to write an overall explanation of this new facility. The individual bits and pieces seem to have good comments but an overall explanation of what's going on here seems to be lacking. It doesn't seem good that get_partitions_from_clauses requires us to reopen the relation. I'm going to give my standard review feedback any time someone injects additional relation_open or heap_open calls into a patch: please look for a way to piggyback on one of the places that already has the relation open instead of adding code to re-open it elsewhere. Reopening it is not entirely free, and, especially when NoLock is used, makes it hard to tell whether we're doing the locking correctly. Note that we've already got things like set_relation_partition_info (which copies the bounds) and set_baserel_partition_key_exprs (which copies, with some partitioning, the partitioning expressions) and also find_partition_scheme, but instead of using that existing data from the RelOptInfo, this patch is digging it directly out of the relcache entry, which doesn't seem great. The changes to set_append_rel_pathlist probably make it slower in the case where rte->relkind != RELKIND_PARTITIONED_TABLE. We build a whole new list that we don't really need. How about just keeping the (appinfo->parent_relid != parentRTindex) test in the loop and setting rel_appinfos to either root->append_rel_list or rel->live_part_appinfos as appropriate? I understand why COLLATION_MATCH think that a collation OID match is OK, but why is InvalidOid also OK? Can you add a comment? Maybe some test cases, too? How fast is this patch these days, compared with the current approach? It would be good to test both when nearly all of the partitions are pruned and when almost none of the partitions are pruned. -- Robert Haas EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company
Commits
-
Fix assorted partition pruning bugs
- d758d9702e2f 11.0 landed
-
Make gen_partprune_steps static
- d1e2cac5ff7e 11.0 landed
-
Remove useless 'default' clause
- c775fb9e18ac 11.0 landed
-
Reorganize partitioning code
- da6f3e45ddb6 11.0 landed
-
Use custom hash opclass for hash partition pruning
- fafec4cce814 11.0 landed
-
Blindly attempt to fix sepgsql tests broken due to 9fdb675fc5.
- 4f813c7203e0 11.0 landed
-
Attempt to fix endianess issues in new hash partition test.
- 40e42e1024c5 11.0 landed
-
Faster partition pruning
- 9fdb675fc5d2 11.0 landed
-
For partitionwise join, match on partcollation, not parttypcoll.
- 2af28e603319 11.0 landed
-
Revise API for partition bound search functions.
- f724022d0ae0 11.0 landed
-
Revise API for partition_rbound_cmp/partition_rbound_datum_cmp.
- b0229235564f 11.0 landed
-
Fix possible crash in partition-wise join.
- f069c91a5793 11.0 cited
-
Refactor code for partition bound searching
- 9aef173163ae 11.0 landed
-
New C function: bms_add_range
- 84940644de93 11.0 landed
-
Add extensive tests for partition pruning.
- 8d4e70a63bf8 11.0 landed
-
Add null test to partition constraint for default range partitions.
- 7b88d63a9122 11.0 cited
-
Remove BufFile's isTemp flag.
- 11e264517dff 11.0 cited
-
Make OWNER TO subcommand mention consistent
- bf54c0f05c0a 11.0 cited
-
Fix index matching for operators with mixed collatable/noncollatable inputs.
- cb37c291060d 9.2.0 cited