Индекс GIN для столбца smallint [] не используется или ошибка «оператор не уникален»

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

Есть индекс джина наtagged колонна, с_int2_ops класс оператора:

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

Когда я запускаю этот запрос:

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

EXPLAIN ANALYZE показывает:

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

Жирный акцент мой. Почемуtagged столбец преобразован вinteger[] тип? Я думаю, что это причина, по которой индекс GIN не используется и запрос выполняется медленно.

Я старалсяWHERE tagged @> ARRAY[11]::smallint[] но получил эту ошибку:

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

Если я делаю то же самое, но используюtagged int[] и создать индекс как

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

тогда вышеупомянутый запрос использует индекс 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[])"

Это немного быстрее, чем предыдущий, но это занимает в среднем 10 секунд - все еще слишком медленно. я хочу попробоватьsmallint[] вместоint[]может быть, это будет быстрее ...

Ответы на вопрос(1)

Ваш ответ на вопрос