Re: BUG #11559: ANY array filters should make use of GIN indexes

Поиск
Список
Период
Сортировка
От Heikki Linnakangas
Тема Re: BUG #11559: ANY array filters should make use of GIN indexes
Дата
Msg-id 5430F3CE.6070603@vmware.com
обсуждение исходный текст
Ответ на BUG #11559: ANY array filters should make use of GIN indexes  (rafal@conjur.net)
Список 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 по дате отправления:

Предыдущее
От: rafal@conjur.net
Дата:
Сообщение: BUG #11559: ANY array filters should make use of GIN indexes
Следующее
От: Walter Willmertinger
Дата:
Сообщение: Re: BUG #11550: Error messages contain not encodable characters (Latin9)