Tenho uma cópia pública do banco de dados Stack Overflow aqui no AWS Aurora Postgres 15.5:
- Servidor: query.smartpostgres.com
- Nome de usuário: somente leitura
- Senha: 511e0479-4d35-49ab-98b1-c3a9d69796f4
A tabela de usuários possui este índice:
create index users_length_displayname on users(length(displayname));
Mas quando executo uma destas consultas:
select * from users where length(displayname) > 35;
select length(displayname) from users where length(displayname) > 35;
Eles não usam o índice funcional, como evidenciado pelos seus planos de consulta :
Então, por quê?
Acho que esta é uma questão de estatística/estimativa.
Inicialmente pensei que também poderia ser um problema de conversão de tipo de dados, já que a coluna
character varying(40)
e o índice estão sendo usadostext
, mas agora percebo que o Postgres está convertendo-os para nós.Consegui fazer com que ele usasse o índice (em uma varredura de bitmap) para a seguinte consulta de correspondência exata diferente, mas ainda muito estimada:
Isto prova que pode utilizar o índice quando as estimativas são melhores, mesmo que ainda estejam muito erradas.
Se você executar o seguinte, ele usa o índice?
Não consegui verificar isso, pois o usuário é somente leitura e, portanto, não pode executar arquivos
analyze
.