Re: [HACKERS] path toward faster partition pruning
Amit Langote <langote_amit_f8@lab.ntt.co.jp>
On 2018/02/03 6:05, Robert Haas wrote: > 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... Thanks for the review. > 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. Agreed. partition.c has gotten quite big and actually more than half of the code that this patch adds really seems to belong outside of it. > 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. Agreed. A partprune.c in the optimizer's util directory seems like a good place. > 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. OK, I will add such a comment. > 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. OK, I have to admit that the quoted heap_open wasn't quite well thought out and I'm almost sure that everything should be fine with the information that set_relation_partition_info() fills in the RelOptInfo. I'm now going through the patch to try to figure out how to make that work. > 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? That's certainly better. Also in set_append_rel_size. > 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? partcollid == InvalidOid means the partition key is of uncollatable type, so further checking the collation is unnecessary. There is a test in partition_prune.sql that covers the failure to prune when collations don't match for a text partition key. > 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. I will include some performance numbers in my next email, which hopefully should not be later than Friday this week. Thanks, Amit
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