2009-05-14 10 views
9

¿Alguien me puede decir cuándo un índice es malo?¿Cuándo es un índice (en un DBMS) un índice malo?

+6

Es posible que desee reelaborar su pregunta (y su título). Tal vez te refieres a "indexación incorrecta de SQL Table": "¿Qué parámetros debo tener en cuenta para definir un índice como un índice incorrecto y reemplazarlo?" –

+5

Érase una vez un índice. Pero este no era un índice ordinario. Parecía normal, pero era un mal índice. Cuando nadie se dio cuenta, se desequilibró con los nodos de las hojas colgando de los nudos de las hojas en un desastre total. No solo tenía demasiados nodos de hoja, sino también una mala paleta de estadísticas. Entonces, un día, un hada llamada DBCC vino y le dijo al índice "¿por qué eres un mal índice? ¿No deberías ser un buen índice como todos los demás índices"? Ella agitó su varita mágica y reindexó. Después de eso, ella actualizó las estadísticas para hacer desaparecer las malas estadísticas. El índice decía al hada "... – KristoferA

+0

Gracias maravillosa explicación – Anoop

Respuesta

1

Si el campo nunca se utiliza, es un índice incorrecto (si sientes que las cosas son innecesarias son malas).

+0

Muchas gracias ... pero ¿cómo se puede decir? un índice creado no usa – Anoop

+0

Ejemplo: tiene un campo llamado: Otros_Comentarios. Nadie ha ingresado datos en el campo. Nadie ha consultado el campo. ¿Cuál sería el sentido de un índice en este campo? simplemente va a ralentizar cualquier inserción, eliminar o actualizar la actividad. – JeffO

11

Si nunca se realiza una búsqueda en la columna indexada y la tabla está muy actualizada, no obtendrá el beneficio del rendimiento para el que son las indeces. Por el contrario, podrías sufrir un golpe de rendimiento.

+0

Muchas gracias – Anoop

1

El índice es para ayudarnos a buscar las filas más rápido.

Si la columna de índice es no utilizada para las búsquedas no tiene sentido definirla.

Si los valores de esa columna seguir cambiando con mucha frecuencia será un trabajo extra para el servidor de base de datos (para volver a clasificar)

Si hay demasiadas inserciones y eliminaciones de la mesa Será un trabajo adicional para el servidor

+0

No olvide que los índices pueden estar en conjuntos de columnas. –

+0

Muchas gracias ... pero ¿cómo podemos decir que una columna indexada no es utilizado con frecuencia – Anoop

+1

@Johathan gracias por el hecho. @ venkat si no está utilizando las columnas indexadas en la cláusula join o where para seleccionar filas de la tabla, se usa con menos frecuencia. – TheVillageIdiot

11

Una circunstancia bajo la cual un índice es incondicionalmente malo es si hay otro índice que usa las mismas columnas (en el mismo orden) como prefijo:

CREATE INDEX ix_good ON SomeTable(Col1, Col2, Col3); 
CREATE INDEX ix_bad ON SomeTable(Col1, Col2); 

La mala índice es un desperdicio de espacio en disco y ralentiza las operaciones de modificar o ningún beneficio.

+1

+1, pero enfatice la porción de "mismo orden". :) – KristoferA

+0

Muchas gracias – Anoop

1

Hay un impacto de rendimiento inherente de tener índices (creación y mantenimiento de la estructura) Por lo general, desea ese golpe para obtener el beneficio de escaneos más rápidos. Cuando no obtienes el beneficio, es solo una pérdida neta y ese es un índice malo.

razones posibles:

  • índices nunca utilizado
  • índices redundantes
  • tablas que no son escaneados muy a menudo, pero actualizan continuamente (el golpe de tener el índice crece más los beneficios, ya que la tabla es rara vez escaneada).
  • Tablas que se escanean con frecuencia y se actualizan continuamente. En este caso, puede obtener el beneficio de un índice y una actualización/inserción rápida al tener una tabla indexable para inserciones/actualizaciones y una tabla con índices para los escaneos que se actualiza en lotes diarios o por hora (hay casos en que esto no ocurre). No funciona, por supuesto. Entonces necesitas obtener un mejor hardware o rediseñar la aplicación si tienes un problema serio de rendimiento en tal caso).

¿Cómo encontrar sus malos índices? La mayoría de los RDBMS tienen opciones para mostrar el plan de consulta, allí puede ver si los índices que configura están siendo utilizados de la manera que espera. Esto me lleva a un consejo final, piense en sus índices, nunca cree uno "por las dudas".

1

Un índice es malo si usted nunca busca en él.Por ejemplo, un índice (Col1, Col2, Col3) es un desperdicio de recursos si nunca busca con Col1, Col2 y Col3 en la misma consulta.

4

Una cosa importante a tener en cuenta con los índices (aparte de la parte de "uso real" mencionada anteriormente) es la noción de selectividad.

Al construir índices, desea crear índices en columnas que tienen una buena posibilidad de "alta selectividad". Esto requiere cierta comprensión de los datos en la columna (que puede o no puede tener según su conocimiento del dominio/disponibilidad de los datos de muestra).

Selectividad = # de valores distintos/# total de filas

permite utilizar una tabla "Personas" con columnas para given_name, apellidos, sexo, edad

Por ejemplo, la creación de un índice en una columna de tales como Género (donde el género está limitado a NULL, M o F) no proporcionaría muchos beneficios durante una consulta (especialmente si la consulta ya resulta en un escaneo de tabla por otros motivos). En cualquier escenario, la selectividad de este índice sería extremadamente baja. Dependiendo del DBMS, usar este índice en realidad puede ser peor que un escaneo de tabla completo.

Sin embargo, la creación de un índice compuesto en (Given_name, Apellido) proporcionaría beneficios al ejecutar consultas contra esas columnas. La selectividad de este índice (para la mayoría de las poblaciones) sería bastante buena.

Un índice con selectividad de 1 es el ideal, sin embargo, la única manera de lograr una selectividad de 1 es tener un índice único en una columna que no admite nulos.

Además, tenga en cuenta que puede escribir fácilmente consultas para "realizar un seguimiento" de sus índices y su selectividad.

Cuestiones relacionadas