Re: BUG #11559: ANY array filters should make use of GIN indexes - Mailing list pgsql-bugs

From Heikki Linnakangas
Subject Re: BUG #11559: ANY array filters should make use of GIN indexes
Date
Msg-id 5430F3CE.6070603@vmware.com
Whole thread Raw
In response to BUG #11559: ANY array filters should make use of GIN indexes  (rafal@conjur.net)
List pgsql-bugs
On 10/03/2014 06:16 PM, rafal@conjur.net wrote:
> Consider schema:
>
> create table arr_test(strs text[]);
> insert into arr_test select array[i, i+1] from generate_series(1, 1000) i;
> create index strs_idx on arr_test using gin(strs);
>
> In this schema, query
>
> select * from arr_test where '2' = any(strs);
>
> yields a plan
>
>                          QUERY PLAN
> ----------------------------------------------------------
>   Seq Scan on arr_test  (cost=0.00..31.50 rows=2 width=37)
>     Filter: ('2'::text = ANY (strs))
>
> yet (AFAICT) equivalent query
>
> select * from arr_test where array['2'] && strs;
>
> uses the index:
>
>                                QUERY PLAN
> -----------------------------------------------------------------------
>   Bitmap Heap Scan on arr_test  (cost=8.02..13.21 rows=2 width=37)
>     Recheck Cond: ('{2}'::text[] && strs)
>     ->  Bitmap Index Scan on strs_idx  (cost=0.00..8.02 rows=2 width=0)
>           Index Cond: ('{2}'::text[] && strs)
>
> In one of our databases with ~150k rows this makes for a difference  in
> speed of four orders of magnitude.
>
>
> Is it possible to have the optimizer automatically use index for ANY queries
> like that? Or are these queries inequivalent in some non-straightforward
> manner?

I think the queries are indeed equivalent. The planner just isn't smart
enough to do the transformation automatically.

(this is not a bug, just a missing feature)

- Heikki

pgsql-bugs by date:

Previous
From: rafal@conjur.net
Date:
Subject: BUG #11559: ANY array filters should make use of GIN indexes
Next
From: Walter Willmertinger
Date:
Subject: Re: BUG #11550: Error messages contain not encodable characters (Latin9)