Re: Changing SQL Inlining Behaviour (or...?) - Mailing list pgsql-hackers
From | Paul Ramsey |
---|---|
Subject | Re: Changing SQL Inlining Behaviour (or...?) |
Date | |
Msg-id | C654D210-ABFE-4F45-AFE7-343FCD095D8E@cleverelephant.ca Whole thread Raw |
In response to | Re: Changing SQL Inlining Behaviour (or...?) (Tom Lane <tgl@sss.pgh.pa.us>) |
Responses |
Re: Changing SQL Inlining Behaviour (or...?)
|
List | pgsql-hackers |
> On Jan 19, 2019, at 5:53 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote: > > I wrote: >> Paul Ramsey <pramsey@cleverelephant.ca> writes: >>> Is there a rule of thumb we can use in costing our wrappers to ensure that they always inline? > >> Not really, which is a weak spot of this whole approach. > > BTW, it suddenly strikes me that at least for the specific cases you've > shown in this thread, worrying about forcing inlining despite multiple > parameter occurrences is solving the wrong problem. As I understand it, > what you're doing is basically expanding some_operation(x,y) into > > x indexable_operator y AND exact_condition(x,y) > > where exact_condition(x,y) is semantically identical to > some_operation(x,y), and the point of the maneuver is to inject > an indexable operator that implements some lossy form of the > exact_condition. But this is not an ideal solution: aside > from the possible cost of evaluating x and y twice, adding > the indexable_operator is just a dead loss if you don't end up > with an indexscan on x. > > So ISTM what we *really* want is that the wrapper function is > just an alias for exact_condition() --- which eliminates the > multiple-evaluation hazards and hence the risk of not inlining --- > and then teach the planner how to extract the indexable_operator > when, and only when, it's actually useful for an indexscan. > > The machinery for that sort of thing already exists; it's what > indxpath.c calls a "special index operator". But right now it's > only applied to some built-in operators such as LIKE. I've had > a personal TODO item for a very long time to make that ability > accessible to extensions, but it never rose to the top of the > queue. Maybe we should be trying to make that happen, instead > of messing around with dubious changes to the inlining rules. > > Does this line of thought seem like it would fix your problem, > or are there places where the inlining rules are causing you > issues but the use-case doesn't look like "add a lossy indexable > operator”? While I’m not 100% sure what this new thing would “look like” there are at least a few quirky variations on the pattern you’vecorrectly identified. So, ST_Intersects(a, b), ST_Contains(a, b) these all match the pattern. One that is similar but not quite matching is ST_DWithin(a, b, radius), which expands to a && expand(b, radius) and b && expand(a, radius) and _ST_DWithin(a, b, radius) so the operator call is doubled up and includes a function all on one operand rather than a bare call. there may be a few other non-standard pattern inlines lying around, but that’s the most commonly used one. P > > regards, tom lane
pgsql-hackers by date: