Индекс 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). Может быть, есть другой способ решить эту проблему?

0 ответов

Другие вопросы по тегам