| From: | Florian Pflug <fgp(at)phlo(dot)org> | 
|---|---|
| To: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> | 
| Cc: | pgsql-hackers(at)postgreSQL(dot)org | 
| Subject: | Re: Pushing ScalarArrayOpExpr support into the btree index AM | 
| Date: | 2011-10-16 18:13:31 | 
| Message-ID: | F2D4A6D6-B8D2-48E9-83AD-E081D34EBC16@phlo.org | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-hackers | 
On Oct16, 2011, at 19:09 , Tom Lane wrote:
> Florian Pflug <fgp(at)phlo(dot)org> writes:
>> On Oct15, 2011, at 20:58 , Tom Lane wrote:
>>> So, at least as far as btrees are concerned, it seems like I implemented
>>> the ScalarArrayOpExpr logic at the wrong level and it ought to be pushed
>>> down into the index AM.  The above rules seem pretty btree-specific, so
>>> I don't think that we ought to have the main executor doing any of this.
>>> I envision doing this by marking btree as supporting ScalarArrayOpExpr
>>> scankeys directly, so that the executor does nothing special with them,
>>> and the planner treats them the same as regular scalar indexquals.
> 
>> Hm, would this make it possible to teach the array GIN ops to also handle
>> ScalarArrayOpExpr?
> 
> Hmm, maybe.  In principle the index AM can always do this at least as
> efficiently as the executor can, and maybe there's actual wins to be had
> in GIST and GIN.  So another route to getting rid of the executor-level
> support would be to implement ScalarArrayOpExpr in all the AMs.  I'm not
> personally volunteering to do that though.
Hm, that sounds like we ought to leave the existing infrastructure in
the main executor in place until we have GIN and GIST support.
>> I've recently had to put
>>  ARRAY[$1] <@ $2 AND $1 = ANY($2)
>> into an (inlineable) SQL function to make it use a (btree) index if
>> $1 is a scalar-values field (and $1 constant array) and a GIN index if $2 
>> is a GIN-indexed array-values field (and $2 a constant array). Which of
>> course sucks from an efficiency POV.
> 
> That doesn't seem like the same thing at all, because the indexed column
> is on different sides of the expression in the two cases.  The situation
> that I'm worried about is "indexedcolumn op ANY(arrayconstant)", and
> what you're bringing up is "constant op ANY(indexedarraycolumn)".
Hm, true
> To fit the latter into the existing opclass infrastructure, we'd have to
> somehow teach the planner that "constant op ANY(indexedarraycolumn)"
> is interchangeable with "indexedarraycolumn @> constant", for pairs of
> operators where that's indeed the case.  Seems like that'd be a lot
> messier than the use-case warrants.
That exactly was what convinced me previously that there's no easy way
to do this. I had hoped that with your patch only the index AMs, instead of
the planner, need to know about these equivalences. 
Couldn't we teach the main executor to push a ScalarArrayOpExpr down
into the index AM if the operator belongs to the index's opclass, one
side is indexed, and the other is constant?
best regards,
Florian Pflug
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Tom Lane | 2011-10-16 18:26:38 | Re: Pushing ScalarArrayOpExpr support into the btree index AM | 
| Previous Message | Tom Lane | 2011-10-16 18:12:40 | Re: patch for new feature: Buffer Cache Hibernation |