Re: Rethinking representation of sort/hash semantics in queries and plans
Tom Lane <tgl@sss.pgh.pa.us>
From: Tom Lane <tgl@sss.pgh.pa.us>
To: pgsql-hackers@postgresql.org
Date: 2010-11-28T22:03:20Z
Lists: pgsql-hackers
Attachments
- simplify-index-pathkeys.patch (text/x-patch) patch
I wrote: > (For some extra amusement, trace through where > build_index_pathkeys' data comes from...) While I don't propose to implement right away the whole SortGroupClause and plan tree modification sketched above, I did look into fixing build_index_pathkeys so that it doesn't uselessly convert from opfamilies to sort operators and back again. The main reason this is relevant at the moment is that we could get rid of relcache.c's caching of operators related to indexes, which seems possibly useful in connection with the current discussion of backend startup time. What becomes apparent when you look closely at what that code is doing is that it's catering to the possibility of an amcanorder index access method that isn't btree. As things stand in HEAD, an add-on index access method would be recognized as supporting ordering so long as it registers the regular comparison operators (<, >, etc) with the same index strategy numbers as btree. The reason that it would work is that those operators would be found as the fwdsortop/revsortop entries for the index, and then looking up those operator OIDs in btree opfamilies would locate the corresponding btree opfamily OIDs, which is what you have to have to match to a pathkey's opfamily. In the attached draft patch that would no longer work, because the new access method would have to have the exact same opfamily OIDs as btree in order to match to btree-derived pathkeys --- and of course it can't have that, since access method is a property of an opfamily. Now, this loss of flexibility doesn't particularly bother me, because I know of no existing or contemplated btree-substitute access methods. If one did appear on the horizon, there are a couple of ways we could fix the problem, the cleanest being to let a non-btree opfamily declare that it sorts the same as btree opfamily so-and-so. Or we could fix it locally in plancat.c by performing the lookup-the-operators-and- then-the-btree-opfamilies dance on the fly when setting up IndexOptInfo for a non-btree amcanorder index. But I'm disinclined to write such code when there's no way to test it and no foreseeable possibility that it'll ever be used. Maybe we should just make plancat.c throw a not-implemented error if amcanorder is true but it's not btree. Thoughts? Anyone particularly opposed to pursuing an optimization of this kind at all? regards, tom lane PS: the attached patch doesn't yet include removal of relcache rd_operator arrays, since that would just make the patch bigger without exposing any new issues.