Индекс 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[]
может быть, это будет быстрее ...