Bre*_*zar 3 postgresql postgresql-performance
我在 AWS Aurora Postgres 15.5 上有一个 Stack Overflow 数据库的公共副本:
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)
他们不使用功能索引,正如他们的查询计划所证明的那样:
那么,呃,为什么?
我认为这是一个统计/估计问题。
我最初认为这也可能是数据类型转换问题,因为列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
.