Re: [PoC] Reducing planning time when tables have many partitions
От | David Rowley |
---|---|
Тема | Re: [PoC] Reducing planning time when tables have many partitions |
Дата | |
Msg-id | CAApHDvoTcHHB2Fi-hDbsS4mkgxRC3S4SmMkEyXNdpmjUySFKuQ@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: [PoC] Reducing planning time when tables have many partitions (Yuya Watari <watari.yuya@gmail.com>) |
Ответы |
Re: [PoC] Reducing planning time when tables have many partitions
|
Список | pgsql-hackers |
isOn Mon, 30 Jan 2023 at 23:03, Yuya Watari <watari.yuya@gmail.com> wrote: > 1. v13-0005 > > The first bug is in eclass_member_iterator_strict_next(). As I > mentioned in the commit message, the original code incorrectly missed > EquivalenceMembers with empty em_relids when 'with_norel_members' is > true. Yeah, I was also looking at this today and found the same issues after adding the verification code that checks we get the same members from the index and via the looking method. I ended up making some changes slightly different from what you had but wasn't quite ready to post them yet. I'm still a little unhappy with master's comments for the EquivalenceMember.em_relids field. It claims to be the relids for the em_expr, but that's not the case for em_is_child members. I've ended up adding an additional field named em_norel_expr that gets set to true when em_expr truly contains no Vars. I then adjusted the conditions in the iterator's loops to properly include members with no Vars when we ask for those. > 2. v13-0006 > > The second bug exists in get_ecmember_indexes_strict(). As I described > in the comment, if the empty relids is given, this function must > return all members because their em_relids are always superset. I am > concerned that this change may adversely affect performance. > Currently, I have not seen any degradation. I fixed this by adding a new field to the iterator struct named relids_empty. It's just set to bms_is_empty(iter->with_relids). The loop condition then just becomes: if (iter->relids_empty || !bms_is_subset(iter->with_relids, em->em_relids)) continue; > 3. v13-0007 > > The last one is in add_eq_member(). I am not sure why this change is > working, but it is probably related to the concerns David mentioned in > the previous mail. The v13-0007 may be wrong, so it should be > reconsidered. Unfortunately, we can't fix it that way. At a glance, what you have would only find var-less child members if you requested that the iterator also gave you with_norel_members==true. I've not looked, perhaps all current code locations request with_norel_members, so your change likely just words by accident. I've attached what I worked on today. I still want to do more cross-checking to make sure all code locations which use these new iterators get the same members as they used to get. In the attached I also changed the code that added a RelOptInfo to root->simple_rel_array[0] to allow the varno=0 Vars made in generate_append_tlist() to be indexed. That's now done via a new function (setup_append_rel_entry()) which is only called during plan_set_operations(). This means we're no longer wastefully creating that entry during the planning of normal queries. We could maybe consider giving this a more valid varno and expand simple_rel_array to make more room, but I'm not sure it's worth it or not. I'm happier that this simple_rel_array[0] entry now only exists when planning set operations, but I'd probably feel better if there was some other way that felt less like we're faking up a RelOptInfo to store EquivalenceMembers in. I've also included a slightly edited version of your code which checks that the members match when using and not using the new indexes. All the cross-checking seems to pass. David
Вложения
В списке pgsql-hackers по дате отправления: