¿Es necesario separar los índices para cada tipo de consulta, o lo hará una obra índice de varias columnas?

dba.stackexchange https://dba.stackexchange.com/questions/197

  •  16-10-2019
  •  | 
  •  

Pregunta

Me algo sabe la respuesta a esta pregunta ya, pero siempre me siento como si no es más que necesito para recoger sobre el tema.

Mi comprensión básica es que, en general, un único índice que solo incluye todos los campos es posible que defeto / clasificación en cualquier momento dado no es probable que sea útil, sin embargo, he visto este tipo de cosas. Al igual que en, alguien pensó: "Bueno, si sólo hay que poner todo esto en un índice, la base de datos se puede utilizar para encontrar lo que necesita", sin haber visto nunca un plan de ejecución de algunas de las consultas reales que se ejecuta.

Imagine una mesa de este modo:

id int pk/uid
name varchar(50)
customerId int (foreign key)
dateCreated datetime

Me podría ver un único índice que incluye los campos name, customerId y dateCreated.

Pero mi opinión es que este índice no se puede utilizar en una consulta como, por ejemplo:

SELECT [id], [name], [customerId], [dateCreated]
   FROM Representatives WHERE customerId=1 
   ORDER BY dateCreated

Para una consulta tal, me parece que una mejor idea sería un índice que incluye los campos customerId y dateCreated, con el campo customerId ser 'primero'. Esto crearía un índice que tendría los datos organizados de tal manera que esta consulta podría encontrar rápidamente lo que necesita -. En el orden que necesita

Otra cosa que veo, tal vez con tanta frecuencia como la primera, es índices individuales en cada campo; Por lo tanto, cada uno de los campos name, customerId y dateCreated.

A diferencia del primer ejemplo, este tipo de disposición me parece a veces a al menos ser parcialmente útil; plan de ejecución de la consulta puede demostrar que al menos se trata de utilizar el índice en la customerId para seleccionar los registros, pero no está utilizando el índice con el campo dateCreated para ordenarlos.


Yo sé que esto es una pregunta amplia, porque la respuesta específica a cualquier consulta en particular en cualquier conjunto particular de tablas es por lo general para ver lo que el plan de ejecución dice que va a hacer, y de lo contrario tomar las características específicas de la tabla (s) y consultas en cuenta. Además, sé que depende de la frecuencia de una consulta podría ejecutarse en contraposición a la sobrecarga de mantener un índice determinado para ello.

Pero supongo que lo que estoy preguntando es como un 'punto de partida' general para los índices, hace la idea de tener índices específicos para específico, las consultas tirados frecuente y los campos en el WHERE o cláusulas ORDER BY sentido?

¿Fue útil?

Solución

Tiene usted razón en que su consulta de ejemplo no usaría ese índice.

El planificador de consulta se considere el uso de un índice si:

  • todos los campos contenidos en él se hace referencia en la consulta
  • algunos de los campos que empiezan desde el principio se hace referencia

No será capaz de hacer uso de los índices que se inician con un campo no utilizado por la consulta.

Así que para su ejemplo:

SELECT [id], [name], [customerId], [dateCreated]
   FROM Representatives WHERE customerId=1 
   ORDER BY dateCreated

que consideraría índices tales como:

[customerId]
[customerId], [dateCreated]
[customerId], [dateCreated], [name]

pero no:

[name], [customerId], [dateCreated]

Si se encuentra tanto [customerId] y [customerId], [dateCreated], [name] su decisión de preferir uno sobre el otro dependerá de las estadísticas del índice que dependen de las estimaciones de la balanza de datos en los campos. Si se define [customerId], [dateCreated] debe preferir que sobre los otros dos menos que dar una sugerencia de índice específica en contrario.

No es raro ver a un índice definido para cada campo en mi experiencia tampoco, aunque esto rara vez es óptima como la gestión adicional necesario para actualizar los índices de inserción / actualización, y el espacio extra necesario para almacenarlos, se desperdicia cuando la mitad de ellos nunca puede acostumbrarse -. pero a menos que su base de datos de escritura ve cargas pesadas el rendimiento no va a oler mal, incluso con el exceso de índices

índices específicos para consultas frecuentes que de otro modo sería lento debido a la mesa o el escaneado índice es generalmente una buena idea, aunque no se exceda ya que podría quedar el intercambio de un problema de rendimiento para otro. Si lo hace [customerId], [dateCreated] definir como un índice, por ejemplo, recuerda que el planificador de consulta será capaz de utilizar que para las consultas que usarían un índice en [customerId] solo si está presente. Mientras que utilizando sólo [customerId] sería ligeramente más eficaz que utilizar el índice compuesto que esto puede ser mitigado por acabar con dos índices que compiten por el espacio en la memoria RAM en lugar de uno (aunque si la totalidad de sus ajustes de espacio de trabajo normales fácilmente en la memoria RAM esta competición memoria adicional no puede ser un problema).

Otros consejos

Para responder a su pregunta original, sí, los índices tienen que ser diseñados alrededor de la consultas , no sólo el tabla . Orden de los campos en el índice es de vital importancia. El diseño de un solo índice que es óptima para múltiples consultas es más difícil, y usted tendrá que hacer concesiones.

En cuanto a su segundo punto, sí, un montón de índices en campos individuales solo es molesto común. Lo veo todo el tiempo en mi entorno, y su por lo general 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 los índices de diseño, es indexar:

  • campos utilizados en DONDE (en orden de selectividad)
  • campos utilizados en ORDER BY
  • Incluir otros campos (si es necesario) para hacer un índice de cobertura

Así que para su ejemplo:

SELECT [id], [name], [customerId], [dateCreated]
   FROM Representatives WHERE customerId=1 
   ORDER BY dateCreated

Probablemente sería diseñar un índice en (CustomerID, DateCreated) incluyen (id, nombre). Este índice cubre significa la consulta no siempre tiene que golpear la tabla original, enormemente mejorando el rendimiento.

Este ejemplo es casi también simple, sin embargo. Un índice ingenua en apenas (CustomerID) llevaría a cabo casi tan bien (suponiendo que cada cliente sólo tiene un solo representante, por lo que se requiere una única búsqueda de marcador de la tabla). También podría incluso ser beneficiosa para hacer realidad un agrupado índice en (CustomerID, ID), dependiendo de qué tipo de duda se ejecutan contra la mesa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top