Postgres ltree 不使用 Gist 索引 为啥?

Posted

技术标签:

【中文标题】Postgres ltree 不使用 Gist 索引 为啥?【英文标题】:Postgres ltree doesn't use Gist index Why?Postgres ltree 不使用 Gist 索引 为什么? 【发布时间】:2021-12-02 19:14:58 【问题描述】:
CREATE TABLE hierarchy_table(id integer PRIMARY KEY,path ltree);

INSERT INTO hierarchy_table
VALUES (1, '1'),
(2,'1.2'),
(3,'1.2.3'),
(4,'1.2.4'),
(5,'1.5'),
(6,'1.5.6'),
(7,'1.5.7'),
(8,'1.5.8');   

CREATE INDEX idx_hierarchy_table_gist ON hierarchy_table USING gist(path);


explain analyze select * from hierarchy_table where '1.2' @> path

结果:

对 hierarchy_table 进行 Seq Scan(成本=0.00..1.10 行=1 宽度=36)(实际 时间=0.009..0.011 行=3 循环=1)

http://sqlfiddle.com/#!17/6e363/2

【问题讨论】:

对于这样的小表,使用索引不会让事情开始变得更快 为什么会这样?在索引中进行查找并使用它来查找表中的行然后只执行Seq Scan 需要更长的时间。 【参考方案1】:

8 行的表对索引毫无意义,对测试也毫无意义。

【讨论】:

你说得对,如果我在插入之前创建索引然后使用索引,但在 ANALYZE 之后没有!谢谢。【参考方案2】:

我观察到,如果我在插入之前创建了 gist 索引,它可以与索引一起使用。

但是重新创建索引很危险:)

【讨论】:

以上是关于Postgres ltree 不使用 Gist 索引 为啥?的主要内容,如果未能解决你的问题,请参考以下文章

postgres中大型数据库的索引

从 postgres 返回多个结果集:引用、函数还是新特性?

Postgres:强制分析器使用位图扫描而不是索引扫描

使用 int8range 连接 2 个大型 postgres 表不能很好地扩展

postgresql----Gist索引

我们可以在不使用 select 语句的情况下选择表数据吗[关闭]