Ya sé un poco la respuesta a esta pregunta, pero siempre siento que hay más cosas que necesito retomar sobre el tema.
Mi comprensión básica es que, en términos generales, un único índice que solo incluye todos los campos que podría estar consultando / ordenando en un momento dado probablemente no sea útil, pero he visto este tipo de cosas. Al igual que en, alguien pensó: "Bueno, si solo ponemos todo esto en un índice, la base de datos puede usarlo para encontrar lo que necesita", sin haber visto nunca un plan de ejecución para algunas de las consultas reales que se ejecutan.
Imagina una mesa así:
id int pk/uid
name varchar(50)
customerId int (foreign key)
dateCreated datetime
Que podría ver un único índice que incluye los name
, customerId
y dateCreated
los campos.
Pero entiendo que dicho índice no se usaría en una consulta como, por ejemplo:
SELECT [id], [name], [customerId], [dateCreated]
FROM Representatives WHERE customerId=1
ORDER BY dateCreated
Para tal consulta, me parece que una mejor idea sería un índice que incluyera los campos customerId
y dateCreated
, siendo el customerId
campo 'primero'. Esto crearía un índice que tendría los datos organizados de tal manera que esta consulta pudiera encontrar rápidamente lo que necesita, en el orden que necesita.
Otra cosa que veo, quizás con tanta frecuencia como la primera, son los índices individuales en cada campo; entonces, uno en cada uno name
, customerId
y dateCreated
campos.
A diferencia del primer ejemplo, este tipo de arreglo me parece a veces al menos parcialmente útil; el plan de ejecución de la consulta puede mostrar que al menos está usando el índice en customerId
para seleccionar los registros, pero no está usando el índice con el dateCreated
campo para ordenarlos.
Sé que esta es una pregunta amplia, porque la respuesta específica a cualquier consulta en particular en un conjunto de tablas en particular es ver lo que el plan de ejecución dice que va a hacer y, de lo contrario, tomar los detalles de las tablas y consultas en cuenta. Además, sé que depende de la frecuencia con la que se ejecute una consulta en lugar de la sobrecarga de mantener un índice particular para ella.
Pero supongo que lo que pregunto es como un "punto de partida" general para los índices, ¿tiene sentido la idea de tener índices específicos para consultas específicas y extraídas con frecuencia y los campos en las cláusulas WHERE u ORDER BY?
fuente
Para responder a su pregunta original, sí, los índices deben diseñarse en torno a las consultas , no solo a la tabla . El orden de los campos en el índice es de vital importancia. Diseñar un solo índice para que sea óptimo para múltiples consultas es más difícil, y tendrá que hacer compensaciones.
Con respecto a su segundo punto, sí, un montón de índices en campos individuales individuales es molestamente común. Lo veo todo el tiempo en mi entorno, y generalmente es una señal de alerta para mí que el equipo de desarrollo no ha trabajado con un DBA para diseñar índices adecuados.
Mi estrategia para diseñar índices es indexar:
Entonces, para su ejemplo:
Probablemente diseñaría un índice en (CustomerID, dateCreated) INCLUDE (id, name). Este índice de cobertura significa que la consulta nunca tiene que llegar a la tabla original, mejorando enormemente el rendimiento.
Sin embargo, este ejemplo es casi demasiado simple. Un índice ingenuo en solo (CustomerID) funcionaría casi igual de bien (suponiendo que cada cliente solo tenga un solo representante, por lo que solo se requerirá una búsqueda de marcadores en la tabla). También podría ser beneficioso hacer un índice agrupado en (CustomerID, ID), dependiendo de qué otras consultas se ejecuten en la tabla.
fuente