为什么 Postgres 不使用我的功能索引?

Bre*_*zar 3 postgresql postgresql-performance

我在 AWS Aurora Postgres 15.5 上有一个 Stack Overflow 数据库的公共副本:

  • 服务器:query.smartpostgres.com
  • 用户名:只读
  • 密码:511e0479-4d35-49ab-98b1-c3a9d69796f4

users 表有这个索引:

create index users_length_displayname on users(length(displayname));
Run Code Online (Sandbox Code Playgroud)

但是当我运行以下任一查询时:

select * from users where length(displayname) > 35;
select length(displayname) from users where length(displayname) > 35;
Run Code Online (Sandbox Code Playgroud)

他们不使用功能索引,正如他们的查询计划所证明的那样:

显示表扫描的查询计划

那么,呃,为什么?

mic*_*des 9

我认为这是一个统计/估计问题。

我最初认为这也可能是数据类型转换问题,因为列character varying(40)和索引正在使用text,但现在意识到 Postgres 正在为我们转换它们。

我确实设法让它使用索引(在位图扫描中)进行以下不同但仍然估计得非常糟糕的精确匹配查询:

explain select * from users where (length(displayname)) = 35;
Run Code Online (Sandbox Code Playgroud)

这证明当估计值更好时它可以使用该指数,即使它们仍然相差甚远。

如果运行以下命令,它是否使用索引?

analyze users;
explain select * from users where (length(displayname)) > 35;
Run Code Online (Sandbox Code Playgroud)

我无法验证这一点,因为用户是只读的,因此无法运行analyze.

  • 表达式上的索引使 PostgreSQL 收集索引表达式的统计信息,但“CREATE INDEX”不会触发自动分析运行,因此您必须自己执行此操作。 (5认同)
  • 做得好!这只是分析问题 - 运行分析后,它工作得很好。 (2认同)