我在 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));
但是当我运行以下任一查询时:
select * from users where length(displayname) > 35;
select length(displayname) from users where length(displayname) > 35;
他们不使用功能索引,正如他们的查询计划所证明的那样:
那么,呃,为什么?
我认为这是一个统计/估计问题。
我最初认为这也可能是数据类型转换问题,因为列
character varying(40)
和索引正在使用text
,但现在意识到 Postgres 正在为我们转换它们。我确实设法让它使用索引(在位图扫描中)进行以下不同但仍然估计得非常糟糕的完全匹配查询:
这证明了当估计值更好时它可以使用该指数,即使它们仍然相差甚远。
如果运行以下命令,它是否使用索引?
我无法验证这一点,因为用户是只读的,因此无法运行
analyze
.