No se utiliza el índice GIN en la columna smallint [] o error "el operador no es único"

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

Hay un índice de ginebra entagged columna, con_int2_ops clase de operador:

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

Cuando ejecuto esta consulta:

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

EXPLAIN ANALYZE muestra:

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

El énfasis en negrita es mío. Porque es eltagged columna convertida ainteger[] ¿tipo? Creo que esta es la razón por la cual GIN no se usa el índice y la consulta se ejecuta lentamente.

Lo intentéWHERE tagged @> ARRAY[11]::smallint[] pero tengo este error:

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

Si hago lo mismo pero usotagged int[] y crear índice como

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

entonces la consulta anterior usa el í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[])"

Esto es un poco más rápido que el anterior, pero toma un promedio de 10 segundos, aún demasiado lento. Quiero intentarlosmallint[] en lugar deint[], tal vez eso sea más rápido ...

Respuestas a la pregunta(1)

Su respuesta a la pregunta