Re: POC: GROUP BY optimization
Dmitry Dolgov <9erthalion6@gmail.com>
From: Dmitry Dolgov <9erthalion6@gmail.com>
To: Tomas Vondra <tomas.vondra@2ndquadrant.com>
Cc: Teodor Sigaev <teodor@sigaev.ru>, Gavin Flower <GavinFlower@archidevsys.co.nz>, Andres Freund <andres@anarazel.de>, Michael Paquier <michael@paquier.xyz>, PostgreSQL Developers <pgsql-hackers@lists.postgresql.org>
Date: 2020-06-20T14:30:10Z
Lists: pgsql-hackers
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Restore preprocess_groupclause()
- 505c008ca37c 17.0 landed
-
Rename PathKeyInfo to GroupByOrdering
- 0c1af2c35c7b 17.0 landed
-
Add invariants check to get_useful_group_keys_orderings()
- 91143c03d4ca 17.0 landed
-
Fix asymmetry in setting EquivalenceClass.ec_sortref
- 199012a3d844 17.0 landed
-
Multiple revisions to the GROUP BY reordering tests
- 874d817baa16 17.0 landed
-
Get rid of pg_class usage in SJE regression tests
- e1b7fde418f2 17.0 landed
-
Rename index "abc" in aggregates.sql
- b91f91870828 17.0 landed
-
Explore alternative orderings of group-by pathkeys during optimization.
- 0452b461bc40 17.0 landed
-
Generalize the common code of adding sort before processing of grouping
- 7ab80ac1caf9 17.0 landed
-
Fix out-dated comment in preprocess_groupclause()
- f6c70b81802a 15.0 landed
- 78a9af1a2764 16.0 landed
-
Force parallelism in partition_aggregate
- 2fe6b2a806f2 16.0 landed
- 01474f56981a 15.0 landed
-
Optimize order of GROUP BY keys
- db0d67db2401 15.0 landed
> On Sat, May 16, 2020 at 04:56:09PM +0200, Tomas Vondra wrote: > > So I don't think there will be a single "interesting" grouping pathkeys > (i.e. root->group_pathkeys), but a collection of pathkeys. And we'll > need to build grouping paths for all of those, and leave the planner to > eventually pick the one giving us the cheapest plan ... > > A "brute-force" approach would be to generate all possible orderings of > group_pathkeys, but that's probably not going to fly - it might easily > cause an explosion in number of paths we track, etc. So we'll need to > pick/prioritize orderings that are more likely to give us efficient > plans, and ORDER BY seems like a good example because it means we won't > need an explicit sort. Yes, I see. I've already rebased the original version of patch and now working on your suggestions. In the meantime one question: > But there are also decisions that can be made only after we build the > grouping paths. For example, we may have both GROUP BY and ORDER BY, and > there is no "always correct" way to combine those. In some cases it may > be correct to use the same pathkeys, in other cases it's better to use > different ones (which will require an extra Sort, with additional cost). Do I understand correctly, your idea is that in some cases it's cheaper to use different order for GROUP BY than in ORDER BY even with an extra sorting? In the current patch implementation there is an assumption that says it's always better to match the order of pathkeys for both GROUP BY/ORDER BY (which means that the only degree of freedom there is to reorder the tail, which in turn makes both "unsorted input" and "partially sorted input" cases from your original email essentially the same). Can you show such an example when this assumption is invalid? > I've only quickly skimmed the old thread, but IIRC there were two main > challenges in getting the optimization right: > > 1) deciding which orderings are interesting / worth additional work > > I think we need to consider these orderings, in addition to the one > specified in GROUP BY: Yes, looks like the current patch implementation together with preprocess_groupclause already implements this, although maybe not that flexible. > 2) costing the alternative orderings > > I think we've already discussed various ways to leverage as much > available info as possible (extended stats, MCVs, ...) but I think the > patch only does some of it. Right, there were couple of ideas what to do in case of a few groups which are too big they can invalidate current assumptions about costs. E.g. do not apply reordering if we detected such situation, or use "conservative" approach and take the biggest group for estimations.