¿Cuáles son los métodos para identificar las columnas innecesarias dentro de un índice de cobertura?

StackOverflow https://stackoverflow.com/questions/1545661

Pregunta

¿Qué métodos existen para identificar columnas superfluos en la cobertura de los índices:? Columnas que nunca se realizaron búsquedas en contra, y por lo tanto se pueden extraer en Incluye, o incluso eliminarse por completo sin afectar a la aplicabilidad del índice

¿Fue útil?

Solución

Para aclarar las cosas
La idea de un índice de cobertura es que también incluye columnas que no puede ser buscado por (utilizado en la cláusula WHERE y tal) pero se puede seleccionar (parte de la SELECT lista de columnas).

No parece haber ninguna manera fácil de afirmar la existencia de columnas no utilizadas en un índice de cobertura . Sólo puedo pensar en un proceso laborioso a continuación:

  • Durante un período de tiempo representativo, ficha todas las consultas que se ejecuta en el servidor (o en la mesa deseada)
  • Filtro cabo (a través de expresiones regulares) no consultas que implican la tabla subyacente
  • Para consultas restante, obtener el plan de consulta; deseche las consultas que no impliquen el índice en cuestión
  • Para las consultas restantes, o más bien para cada "plantilla" de la consulta (muchas consultas son iguales, pero para los criterios de búsqueda valores), hacen que la lista de las columnas del índice que se encuentren en la cláusula Select o en la (o en JOIN ...)
  • las columnas del índice no se encuentra en esa lista son positivamente bueno para ir.

Ahora, puede haber un poco más de [columnas para eliminar] debido a que el proceso anterior no comprueba en qué contexto se utiliza el índice de recubrimiento (es posible que se utilice para resolver el dónde, pero que la tabla subyacente todavía se accede también (por ejemplo para llamar a las columnas no en el índice de cobertura ...)

El enfoque clínico anterior es bastante poco atractivo. Un enfoque analítico puede ser preferible :

Para todas las consultas "plantillas" que se pueden utilizar en todas las aplicaciones que utilizan el servidor. Para cada uno de estos patrones, encontrar los que puedan estar usando el índice de cobertura. Estos son (de nuevo un par de agujeros ...) Las consultas que:

  • incluir una referencia a la tabla subyacente
  • No citar en modo alguno una columna de la tabla subyacente que no es una columna en el índice
  • No utilice un criterio de búsqueda de la tabla subyacente que es más selectiva que las columnas del índice (en su orden mismo ...)

O ... sin tener que ir a las aplicaciones: pensar en todos los casos de uso , y si las consultas que servirían estos casos se beneficiarían de no desde todas las columnas en el índice. Si lo hace, implicaría que tiene una relativamente buena idea de la selectividad del índice, con respecto a sus primeras columnas.

Otros consejos

Si lo hace auditorías de sus casos de uso y los puntos de datos, obviamente, nada que no se utiliza o atrapado en la auditoría es un candidato para su eliminación. Si la base de datos carece de una auditoría de este tipo a fondo, puede guardar una pena de ventana de tiempo de las consultas que afectaron a la base de datos mediante la ejecución de un rastro y guardarlo. Puede analizar la traza y ver qué tipo de consultas están golpeando la base de datos y de allí intuir qué columnas se pueden descartar.

Análisis de trazas se suele utilizar para encontrar candidatos para faltante índices, pero supongo que podría también ser utilizado para analizar las tendencias de uso.

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