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 ANALYZE
una SELECT
consulta, 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 NULL
puede 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 NULL
columna para unaIS NOT NULL
consulta a menos que ese índice también sea útil para otras partes de laWHERE
clá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 NULL
en laNOT NULL
columna 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 NULL
consultas 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 NULL
como 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