Pregunta

Por ejemplo:

Given columns A,B,C,D,

IX_A is an index on 'A'

IX_AB is a covering index on 'AB'

IX_A se puede quitar con seguridad, porque es redundante: IX_AB se utilizará en su lugar. Quiero saber si esto se generaliza:

Si tengo:

IX_AB
IX_ABC
IX_ABCD

y así sucesivamente,

Todavía puede eliminarse de manera segura los índices menores? Es decir, ¿IX_ABC hacer IX_AB redundante, y hace IX_ABCD hacer tanto IX_AB y IX_ABC redundante?

¿Fue útil?

Solución

En general - y esto varía de servidor a servidor -. Un índice de cobertura cubrirá más pequeñas-selecciones del índice

Así que si usted tiene un índice que cubre a, b, c, que por lo general le da automáticamente un índice que cubre una, y a, b.

No está garantizado para tener, por ejemplo, un índice de cobertura de b, c.

Otros consejos

Sí, en su mayor parte.

Sin embargo, IX_ABCD no es muy útil como un reemplazo para, por ejemplo, IX_BCD.

Hay una advertencia, sin embargo: los índices todavía pueden requerir lecturas de disco, por lo que si C y D explotan el tamaño del índice, habrá cierta ineficiencia en mirando hacia arriba A, B IX_ABCD en que no se produciría cuando se busca que en IX_AB.

Sin embargo, esa diferencia es probable que compensado por el impacto de rendimiento adicional de mantener IX_AB por separado.

Lo importante es las principales columnas en el índice. Si usted tiene el índice IX_ABCD las siguientes consultas utilizará el índice:

selecciona * de la tabla en la que A = 1

selecciona * de la tabla en la que A = 1 y B = 1

selecciona * de la tabla en la que A = 1 y B = 1 y C = 1

Sin embargo, lo siguiente será más probable es que no utiliza el índice (al menos no la forma en que la intención):

SELECT * de la tabla donde B = 1

SELECT * de la tabla donde C = 1

SELECT * de la tabla donde B = 1 y C = 1

Lo importante es que se utilizan las columnas principales. Por lo tanto, el orden de las columnas cuando se crea el índice sí importa.

No necesariamente. Si bien es cierto que un índice en (A, B, C) se puede utilizar para un predicado filtrado en A o una solicitud de pedido en A o una condición de unión sobre A, que no necesariamente significa que el índice de (A) solo es inútil . Si el índice en (A, B, C) es considerablemente más amplio de (A), a continuación, un análisis por rangos en una sola salvará Me significativa de E / S, ya que tendría que leer un menor número de páginas (índice más estrecho ).

ut I admint que esta sería la excepción y no la regla. En general es seguro quitar un índice en una si existe otro en (A, B). Tenga en cuenta que un índice en (A, B) no satisface ningún tipo de filtrado en modo B, es seguro quitar sólo si la columna (s) más a la izquierda son los mismos. Algunas bases de datos tienen 'skip-scan' operadores que pueden utilizar un índice en (A, B) para buscar B, pero que es un caso límite muy estrecho.

Siempre es mejor no asumir nada acerca internos del motor de base de datos y comprobar realmente los planes de consulta reales que se utilizan.

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