Индекс GIN PostgreSQL для столбца BIGINT - PullRequest
0 голосов
/ 18 октября 2018

У меня есть таблица 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 индекс будет работать так, как я ожидаю

tbl - данные TEXT - fk_id INT - текст TEXT

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

...