Re: POC: GROUP BY optimization - Mailing list pgsql-hackers
From | Tom Lane |
---|---|
Subject | Re: POC: GROUP BY optimization |
Date | |
Msg-id | 266850.1712879082@sss.pgh.pa.us Whole thread Raw |
In response to | Re: POC: GROUP BY optimization (Andrei Lepikhov <a.lepikhov@postgrespro.ru>) |
Responses |
Re: POC: GROUP BY optimization
Re: POC: GROUP BY optimization Re: POC: GROUP BY optimization Re: POC: GROUP BY optimization Re: POC: GROUP BY optimization Re: POC: GROUP BY optimization |
List | pgsql-hackers |
I'm late to the party, and I apologize for not having paid attention to this thread for months ... but I am wondering why 0452b461b got committed. It seems to add a substantial amount of complexity and planner cycles in return for not much. The reason why I'm dubious about it can be found in this comment that the patch deleted: - * In principle it might be interesting to consider other orderings of the - * GROUP BY elements, which could match the sort ordering of other - * possible plans (eg an indexscan) and thereby reduce cost. We don't - * bother with that, though. Hashed grouping will frequently win anyway. Indeed, if you remove the SET enable_hashagg = off; SET enable_seqscan = off; lines added to aggregates.sql, you find that every single one of the test cases added there changes plan, except for the one case that is there to prove that the planner *doesn't* pick this type of plan. That shows that the planner doesn't believe any of the plans developed here are cheaper than other alternatives it would normally consider (usually HashAgg). So it sure seems like we're spending a lot of effort on uninteresting plans. Maybe this is an artifact of testing against toy tables and a useful win could be shown on bigger tables, but I don't see any indication in the thread that anyone actually demonstrated that. I might hold still for this patch anyway if the patch were simpler and more obviously correct, but there are scary bits in it: * The very first hunk causes get_eclass_for_sort_expr to have side-effects on existing EquivalenceClass data structures. What is the argument that that's not going to cause problems? At the very least it introduces asymmetry, in that the first caller wins the chance to change the EC's ec_sortref and later callers won't be able to. * I'm pretty unconvinced by group_keys_reorder_by_pathkeys (which I notice has already had one band-aid added to it since commit). In particular, it seems to believe that the pathkeys and clauses lists match one-for-one, but I seriously doubt that that invariant remains guaranteed after the cleanup steps /* append the remaining group pathkeys (will be treated as not sorted) */ *group_pathkeys = list_concat_unique_ptr(new_group_pathkeys, *group_pathkeys); *group_clauses = list_concat_unique_ptr(new_group_clauses, *group_clauses); For that to be reliable, the SortGroupClauses added to new_group_clauses in the main loop have to be exactly those that are associated with the same pathkeys in the old lists. I doubt that that's necessarily true in the presence of redundant grouping clauses. (Maybe we can't get here with any redundant grouping clauses, but still, we don't really guarantee uniqueness of SortGroupClauses, much less that they are never copied which is what you need if you want to believe that pointer equality is sufficient for de-duping here. PathKeys are explicitly made to be safe to compare pointer-wise, but I know of no such guarantee for SortGroupClauses.) * It seems like root->processed_groupClause no longer has much to do with the grouping behavior, which is scary given how much code still believes that it does. I suspect there are bugs lurking there, and am not comforted by the fact that the patch changed exactly nothing in the pathnodes.h documentation of that field. This comment looks pretty silly now too: /* Preprocess regular GROUP BY clause, if any */ root->processed_groupClause = list_copy(parse->groupClause); What "preprocessing" is going on there? This comment was adequate before, when the code line invoked preprocess_groupclause which had a bunch of commentary; but now it has to stand on its own and it's not doing a great job of that. * Speaking of pathnodes.h, PathKeyInfo is a pretty uninformative node type name, and the comments provided for it are not going to educate anybody. What is the "association" between the pathkeys and clauses? I guess the clauses are supposed to be SortGroupClauses, but not all pathkeys match up to SortGroupClauses, so what then? This is very underspecified, and fuzzy thinking about data structures tends to lead to bugs. So I'm quite afraid that there are still bugs lurking here. What's more, given that the plans this patch makes apparently seldom win when you don't put a thumb on the scales, it might take a very long time to isolate those bugs. If the patch produces a faulty plan (e.g. not sorted properly) we'd never notice if that plan isn't chosen, and even if it is chosen it probably wouldn't produce anything as obviously wrong as a crash. If this patch were producing better results I'd be more excited about putting more work into it. But on the basis of what I'm seeing right now, I think maybe we ought to give up on it. regards, tom lane
pgsql-hackers by date: