sql >> Base de Datos >  >> RDS >> PostgreSQL

Postgres:¿es esta la forma correcta de crear un índice parcial en una columna booleana?

He confirmado que el índice funciona como se esperaba.

Volví a crear los datos aleatorios, solo que esta vez configuré diet_glutenfree a random() > 0.9 por lo que solo hay un 10 % de posibilidades de que on poco.

Luego volví a crear los índices y probé la consulta nuevamente.

SELECT RecipeId from RecipeMetadata where diet_glutenfree;

Devoluciones:

'Index Scan using idx_recipemetadata_glutenfree on recipemetadata  (cost=0.00..135.15 rows=1030 width=16)'
'  Index Cond: (diet_glutenfree = true)'

Y:

SELECT RecipeId from RecipeMetadata where NOT diet_glutenfree;

Devoluciones:

'Seq Scan on recipemetadata  (cost=0.00..214.26 rows=8996 width=16)'
'  Filter: (NOT diet_glutenfree)'

Parece que mi primer intento estuvo contaminado ya que PG estima que es más rápido escanear toda la tabla en lugar de presionar el índice si tiene que cargar más de la mitad de las filas de todos modos.

Sin embargo, creo que obtendría estos resultados exactos en un índice completo de la columna. ¿Hay alguna forma de verificar el número de filas indexadas en un índice parcial?

ACTUALIZAR

El índice es de alrededor de 40k. Creé un índice completo de la misma columna y tiene más de 200k, por lo que parece que es definitivamente parcial.