2008-08-27 15 views
6

Tengo una tabla con muchos millones de filas. Necesito encontrar todas las filas con un valor de columna específico. Esa columna no está en un índice, por lo que se obtiene un escaneo de tabla.Exploración de tabla vs. Agregar índice: ¿qué es más rápido?

Pero, ¿sería más rápido agregar un índice con la columna en el encabezado (siguiente la clave principal), hacer la consulta, luego soltar el índice?

No puedo agregar un índice permanentemente ya que el usuario está nominando qué columna están buscando.

Respuesta

2

Agregar un índice requiere un escaneo de tabla, por lo que si no puede agregar un índice permanente, parece que un único escaneo será (ligeramente) más rápido.

2

No, eso no sería más rápido. ¡Lo que sería más rápido es simplemente agregar el índice y dejarlo allí!

Por supuesto, puede no ser práctico indexar cada columna, pero de nuevo puede ser. ¿Cómo se agregan los datos a la tabla?

2

No lo sería. Crear un índice es más complejo que simplemente escanear la columna, incluso si la complejidad computacional es la misma.

Dicho esto, ¿cuántas columnas tiene? ¿Estás seguro de que no puedes simplemente crear un índice para cada uno de ellos si el tiempo de consulta para un solo hallazgo es demasiado largo?

7

No soy DBA, pero supongo que construir el índice requeriría escanear la tabla de todos modos.

A menos que haya varias consultas en esa columna, recomendaría no crear el índice.

¡Sin embargo, es mejor verificar los planes de explicación/tiempos de ejecución de ambas maneras!

2

Depende de la complejidad de su consulta. Si está recuperando los datos una vez, entonces hacer un escaneo de tabla es más rápido. Sin embargo, si regresa a la tabla más de una vez para obtener información relacionada en la misma consulta, entonces el índice es más rápido.

Otra estrategia relacionada es hacer el escaneo de tabla, y poner todos los datos en una tabla temporal. Luego indexe ESO y luego puede hacer todas sus selecciones, agrupaciones y otras consultas posteriores en el subconjunto de datos indexados. El beneficio es que buscar información relacionada en tablas relacionadas utilizando la tabla temporal es MUCHO más rápido.

Sin embargo, el espacio es barato en estos días, por lo que lo mejor será examinar cómo los usuarios realmente UTILIZAN su sistema y agregan índices a esas columnas frecuentes. Aún no he visto que los usuarios usen TODOS los parámetros de búsqueda TODO el tiempo.

3

Como todos han dicho, ciertamente no sería más rápido agregar un índice de lo que sería hacer un escaneo completo de esa columna.

Sin embargo, sugiero seguir el patrón de consulta y descubrir qué columna (s) se buscan más, y agregar índices al menos para ellos. Puede descubrir que 3-4 índices acelera el 90% de sus consultas.

9

Dos preguntas para pensar:

  1. ¿Cuántas columnas podría presentarse para la consulta?
  2. ¿Los datos cambian con frecuencia? ¿Mucho de eso?

Si usted tiene un número pequeño de columnas candidatos, y los datos no cambia mucho , entonces es posible que desee considerar la adición de un índice permanente en cualquiera o incluso toda la columna candidato.

"Blasfemia!", escuché. La mayoría de las fuentes te dicen que "nunca" indices todas las columnas de una tabla, pero esto se basa en la suposición genérica de que las tablas se modifican con frecuencia.

Pagará un precio en almacenamiento adicional, así como un rendimiento alcanzado cuando los datos cambian.

¿Qué tan pequeño es pequeño y cuánto es mucho, y es la compensación vale la pena? No hay forma de decirlo a priori porque "demasiado lento" suele ser una medida subjetiva.

Tendrás que probarlo, medir el tamaño de tus índices y luego el efecto que tienen en las búsquedas. Deberá equilibrar los costos con el aumento en la satisfacción de sus clientes.

[Agregado] Ah, una cosa más: los índices temporales no solo son físicamente más lentos que un escaneo de tabla, sino que destruirían su concurrencia. Volver a indexar una tabla generalmente (¿siempre?) Requiere un bloqueo de tabla completo, por lo que en efecto, solo se puede realizar una búsqueda de usuario a la vez.

Buena suerte.

2

Su solución no se escalará a menos que agregue un índice permanente a cada columna, con todas las columnas que se devuelven en la consulta en la lista de columnas incluidas (un índice de cobertura). Estos índices serán muy grandes, y las inserciones y actualizaciones en esa tabla serán un poco más lentas, pero no tendrá muchas opciones si permite que un usuario seleccione arbitrariamente una columna de búsqueda.

¿Cuántos columnas hay? ¿Con qué frecuencia se actualizan los datos? ¿Qué tan rápido deben ejecutarse las inserciones y actualizaciones? Hay intercambios involucrados, dependiendo de las respuestas a esas preguntas. Haz muchos experimentos y pruebas para que estés seguro de cómo funcionarán las cosas.

Pero para su pregunta original, agregar y soltar un índice con el propósito de una única consulta solo es beneficioso si hace más de una selección durante la consulta (por ejemplo, la selección está en una sub consulta que se ejecuta por cada fila devuelta).

Cuestiones relacionadas