Aunque los índices en PostgreSQL no necesitan mantenimiento ni ajuste, sigue siendo importante comprobar qué índices son utilizados realmente por la carga de trabajo de consultas de la vida real. El examen del uso del índice para una consulta individual se realiza con el comando EXPLAIN; su aplicación para este propósito se ilustra en el Section 14.1. También es posible recopilar estadísticas generales sobre el uso de los índices en un servidor en ejecución, como se describe en el Section 27.2.
Es difícil formular un procedimiento general para determinar qué índices crear. Hay una serie de casos típicos que se han mostrado en los ejemplos a lo largo de las secciones anteriores. A menudo es necesaria una buena dosis de experimentación. El resto de esta sección ofrece algunos consejos para ello:
Ejecuta siempre primero ANALYZE. Este comando
recopila estadísticas sobre la distribución de los valores en la
tabla. Esta información es necesaria para estimar el número de filas
devueltas por una consulta, lo cual necesita el planificador para asignar
costos realistas a cada plan de consulta posible. A falta de
estadísticas reales, se asumen algunos valores por defecto, que es
casi seguro que serán inexactos. Por lo tanto, examinar el uso de los
índices de una aplicación sin haber ejecutado ANALYZE es
una causa perdida.
Consulta Section 24.1.3
y Section 24.1.6 para más información.
Utiliza datos reales para la experimentación. El uso de datos de prueba para configurar los índices te dirá qué índices necesitas para los datos de prueba, pero eso es todo.
Es especialmente fatal utilizar conjuntos de datos de prueba muy pequeños. Mientras que seleccionar 1000 de 100000 filas podría ser candidato para un índice, seleccionar 1 de 100 filas difícilmente lo será, porque las 100 filas probablemente quepan en una sola página de disco, y no hay plan que pueda superar la recuperación secuencial de 1 página de disco.
También ten cuidado al inventar datos de prueba, lo cual a menudo es inevitable cuando la aplicación aún no está en producción. Los valores que son muy similares, completamente aleatorios o insertados en orden ordenado desviarán las estadísticas de la distribución que tendrían los datos reales.
Cuando no se utilicen los índices, puede ser útil para las pruebas forzar
su uso. Existen parámetros en tiempo de ejecución que pueden desactivar
varios tipos de planes (consulta Section 19.7.1).
Por ejemplo, desactivar los escaneos secuenciales
(enable_seqscan) y las uniones de bucle anidado
(enable_nestloop), que son los planes más básicos,
forzará al sistema a utilizar un plan diferente. Si el sistema
sigue eligiendo un escaneo secuencial o una unión de bucle anidado, probablemente
haya una razón más fundamental por la que no se está utilizando el índice;
por ejemplo, la condición de la consulta no coincide con el índice.
(Qué tipo de consulta puede usar qué tipo de índice se explica en
las secciones anteriores).
Si al forzar el uso del índice este se utiliza, entonces hay dos
posibilidades: O bien el sistema tiene razón y utilizar el índice es
de hecho inadecuado, o las estimaciones de costos de los planes de consulta
no reflejan la realidad. Por lo tanto, deberías cronometrar tu consulta con
y sin índices. El comando EXPLAIN ANALYZE
puede ser útil aquí.
Si resulta que las estimaciones de costos son erróneas, hay, de nuevo, dos posibilidades. El costo total se calcula a partir de los costos por fila de cada nodo del plan multiplicados por la estimación de selectividad del nodo del plan. Los costos estimados para los nodos del plan se pueden ajustar mediante parámetros en tiempo de ejecución (descritos en Section 19.7.2). Una estimación de selectividad inexacta se debe a estadísticas insuficientes. Podría ser posible mejorar esto ajustando los parámetros de recopilación de estadísticas (consulta ALTER TABLE).
Si no logras ajustar los costos para que sean más adecuados, es posible que tengas que recurrir a forzar el uso del índice explícitamente. También es posible que desees ponerte en contacto con los desarrolladores de PostgreSQL para examinar el problema.