He estado leyendo este libro que dice que
La base de datos supone que Indexed_Col IS NOT NULL cubre un rango demasiado grande para ser útil, por lo que la base de datos no se dirigirá a un índice desde esta condición.
Reconozco que el libro tiene más de 10 años, pero ya ha demostrado ser bastante útil: utilizando las instrucciones extraídas de sus páginas, he acelerado una consulta por un factor de diez.
Además, al ejecutar EXPLAIN ANALYZEuna SELECTconsulta, descubrí que ninguno de mis índices se está utilizando, incluso cuando todos los derechos deberían serlo.
Por lo tanto, mi pregunta es:
Supongamos que hay una tabla que tiene una columna, cuya definición de columna incluye "NOT NULL", y que existe un índice que cubre esta columna, ¿se usaría este índice en una consulta de esa tabla donde las columnas son parte de la consulta?
Me gusta:
CREATE TABLE my_table(
a varchar NOT NULL
);
CREATE INDEX ix_my_table ON my_table(a);
SELECT a from my_table;
fuente

WHERE column IS NOT NULLpuede no usar el índice porque, como dice el libro: "cubre un rango demasiado grande para ser útil". Si el 90% de los valores no son nulos, un seqscan probablemente también sea más rápido.NOT NULLcolumna para unaIS NOT NULLconsulta a menos que ese índice también sea útil para otras partes de laWHEREcláusula, filtros de unión, etc., o sea utilizable para una exploración ordenada de solo índice. En otras palabras, ignorará por completo el redundanteIS NOT NULLen laNOT NULLcolumna y hará que las opciones de uso del índice se basen en otros detalles. (Consulte editar, volver a escanear solo índices).Además de la respuesta exhaustiva de Craig, quería agregar que la portada del libro al que hace referencia dice:
Por lo tanto, no confiaría en que sea una gran fuente de asesoramiento sobre PostgreSQL en particular. ¡Cada RDBMS puede ser sorprendentemente diferente!
Estoy un poco confundido acerca de su pregunta original, pero aquí hay un ejemplo que muestra que la sección del libro no es 100% correcta. Para evitar más confusión, aquí está todo el párrafo relevante, puede verlo en Google Book Search .
Postgres puede en realidad (en el siguiente caso artificial) usar un índice para satisfacer
IS NOT NULLconsultas sin agregar kludges de escaneo de rango como el sugeridoPositive_ID_Column > -1. Vea los comentarios sobre las preguntas de Craig sobre por qué Postgres está eligiendo este índice en este caso particular, y la nota sobre el uso de índices parciales.Por cierto, esto es Postgres 9.3, pero creo que los resultados serían más o menos similares en 9.1, aunque no usaría un "Escaneo de solo índice".
Editar: veo que ha aclarado su pregunta original, y aparentemente se pregunta por qué Postgres no está usando un índice en un ejemplo simple como:
Probablemente porque no tienes filas en la tabla. Entonces agregue algunos datos de prueba y
ANALYZE my_table;.fuente
NOT NULL, no que la consulta utilizaIS NOT NULLcomo condición de índice. Esto está en los comentarios a los que hizo referencia, pero actualizaré la pregunta para incluirla.No ha publicado su consulta o datos de ejemplo. Pero la razón más común por la que no se usan los índices tiene que ver con el volumen.
Los índices son como una agenda telefónica que traduce una columna a una ubicación de fila. Si solo está buscando unas pocas filas, tiene sentido buscar cada fila en la agenda y luego buscar la fila en la tabla principal.
Pero durante más de unas pocas filas, es más barato omitir la agenda e iterar sobre todas las filas de la tabla principal. En mi experiencia, el punto de inflexión es de alrededor de 100 filas.
fuente
CREATE INDEX ix_frank ON people(name) WHERE name ='frank'.NOT NULL