BIGINT列的PostgreSQL GIN索引

时间:2018-10-18 12:13:31

标签: postgresql pg-trgm

我有带有列的表tbl -数据TEXT -fk_id BIGINT -文字TEXT

有超过1亿条记录,并且fk_id的〜1K个不同值。 我需要像这样运行查询

SELECT * FROM tbl WHERE fk_id=12345 AND text LIKE '%abcdef%

我尝试将扩展名GINbtree_gingin_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)

但是,如果我对列fk_id使用INT类型而不是BIGINT,则索引将按预期工作

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索引? Documentation说,btree_gin与int4(INT)和int8(BIGINT)一起使用。 也许还有另一种方法可以解决这个问题?

0 个答案:

没有答案