Индекс GIN PostgreSQL для столбца BIGINT
У меня есть стол tbl
со столбцами - данные TEXT
- fk_id BIGINT
- текст TEXT
Существует более 100 миллионов записей и ~1K различных значений для fk_id. Мне нужно выполнить запрос, как это
SELECT * FROM tbl WHERE fk_id=12345 AND text LIKE '%abcdef%
Я пытался использовать расширение GIN
индекс с btree_gin
а также gin_trgm_ops
CREATE EXTENSION pg_trgm;
CREATE EXTENSION btree_gin;
CREATE INDEX on tbl USING GIN (fk_id, text gin_trgm_ops)
Но анализатор запросов игнорирует столбец fk_id
для запроса
explain select * from tbl where fk_id = 12345 and text like '%abcdef%' limit 10;
Limit (cost=28.00..32.02 rows=1 width=90)
-> Bitmap Heap Scan on tbl (cost=28.00..32.02 rows=1 width=90)
Recheck Cond: (text ~~ '%abcdef%'::text)
Filter: (fk_id = 12345)
-> Bitmap Index Scan on table_fk_id_text_idx (cost=0.00..28.00 rows=1 width=0)
Index Cond: (text ~~ '%abcdef%'::text)
Но если я использую тип INT вместо BIGINT для столбца fk_id, index будет работать так, как я ожидаю
tbl
- данные ТЕКСТ - fk_id INT - текст ТЕКСТ
explain select * from tbl where fk_id = 12345 and text like '%abcdef%' limit 10;
Limit (cost=36.00..40.02 rows=1 width=90)
-> Bitmap Heap Scan on tbl (cost=36.00..40.02 rows=1 width=90)
Recheck Cond: ((fk_id = 12345) AND (text ~~ '%abcdef%'::text))
-> Bitmap Index Scan on tbl_fk_id_text_idx (cost=0.00..36.00 rows=1 width=0)
Index Cond: ((fk_id = 12345) AND (text ~~ '%abcdef%'::text))
Итак, я могу использовать GIN с INT, но не могу использовать GIN с BIGINT. Почему я не могу использовать столбец BIGINT для индекса GIN? Документация гласит, что btree_gin работает с int4(INT) и с int8(BIGINT). Может быть, есть другой способ решить эту проблему?