Índice GIN na coluna smallint [] não utilizada ou erro "operador não é exclusivo"

create table test(
    id serial primary key,
    tagged smallint[]
);

Existe índice de gin emtagged coluna, com_int2_ops classe de operador:

CREATE INDEX ix ON test USING GIN(col _int2_ops);

Quando executo esta consulta:

select * from test
where tagged @> ARRAY[11]
order by id limit 100;

EXPLAIN ANALYZE mostra:

Limit  (cost=0.43..19524.39 rows=100 width=36) (actual time=25024.124..25027.263 rows=100 loops=1)
  ->  Index Scan using test_pkey on test  (cost=0.43..508404.37 rows=2604 width=36) (actual time=25024.121..25027.251 rows=100 loops=1)
        Filter: ((tagged)::integer[] @> '{11}'::integer[])
        Rows Removed by Filter: 2399999
Planning time: 6.912 ms
Execution time: 25027.307 ms

Negrito ênfase minha. Porque é otagged coluna convertida eminteger[] tipo? Eu acho que esta é a razão pela qual GIN o índice não é usado e a consulta é lenta.

eu tenteiWHERE tagged @> ARRAY[11]::smallint[] mas recebi este erro:

operator is not unique: smallint[] @> smallint[]

Se eu fizer o mesmo, mas usartagged int[] e crie um índice como

CREATE INDEX ix ON test USING GIN(tagged gin__int_ops);

a consulta acima usa o índice GIN:

"->  Bitmap Index Scan on ix  (cost=0.00..1575.53 rows=2604 width=0) (actual time=382.840..382.840 rows=2604480 loops=1)"
"   Index Cond: (tagged @> '{11}'::integer[])"

Isso é um pouco mais rápido que o anterior, mas leva em média 10 segundos - ainda é muito lento. eu quero tentarsmallint[] ao invés deint[], talvez isso seja mais rápido ...

questionAnswers(1)

yourAnswerToTheQuestion