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?