He oído que debe colocar columnas que serán las más selectivas al comienzo de la declaración de índice. Ejemplo:
CREATE NONCLUSTERED INDEX MyINDX on Table1
(
MostSelective,
SecondMost,
Least
)
En primer lugar, ¿lo que digo es correcto? Si es así, ¿es probable que vea grandes diferencias en el rendimiento al reorganizar el orden de las columnas en mi índice o es más una práctica "agradable de hacer"?
La razón por la que pregunto es porque después de realizar una consulta a través del DTA, recomendó que creara un índice que tuviera casi todas las mismas columnas que un índice existente, solo en un orden diferente. Estaba considerando agregar las columnas que faltaban al índice existente y llamarlo bueno. Pensamientos?
fuente
El orden de las columnas es crítico. Ahora, qué orden es correcto, depende de cómo va a consultarlo. Se puede usar un índice para hacer una búsqueda exacta o un escaneo de rango. Una búsqueda exacta es cuando se especifican valores para todas las columnas del índice y la consulta aterriza exactamente en la fila que le interesa. Para las búsquedas, el orden de las columnas es irrelevante. Una exploración de rango es cuando solo se especifican algunas columnas, y en este caso cuando el orden se vuelve importante. SQL Server puede usar un índice para una exploración de rango solo si se especifica la columna más a la izquierda, y luego solo si se especifica la siguiente columna a la izquierda, y así sucesivamente. Si tiene un índice en (A, B, C) puede usarse para escanear el rango para
A=@a
,A=@a AND B=@b
pero no paraB=@b
, paraC=@c
niB=@b AND C=@c
. El casoA=@a AND C=@c
es mixto, como en elA=@a
la porción usará el índice, peroC=@c
no (la consulta escaneará todos los valores de BA=@a
, no 'saltará' aC=@c
). Otros sistemas de bases de datos tienen el llamado operador 'omitir exploración' que puede aprovechar algunas de las columnas internas de un índice cuando no se especifican las columnas externas.Con ese conocimiento en la mano, puede volver a ver las definiciones de índice. Un índice
(MostSelective, SecondMost, Least)
activado solo será efectivo cuandoMostSelective
se especifique la columna. Pero al ser el más selectivo, la relevancia de las columnas internas se degradará rápidamente. Muy a menudo encontrará que un mejor índice está activado(MostSelective) include (SecondMost, Least)
o activado(MostSelective, SecondMost) include (Least)
. Debido a que las columnas internas son menos relevantes, colocar columnas de baja selectividad en esas posiciones correctas en el índice no hace más que ruido para una búsqueda, por lo que tiene sentido moverlas fuera de las páginas intermedias y mantenerlas solo en las páginas de hoja, para fines de cobertura de consultas. En otras palabras, muévalos para INCLUIR. Esto se vuelve más importante a medida que aumenta el tamaño de laLeast
columna. La idea es que este índice solo pueda beneficiar consultas que especifiquenMostSelective
ya sea como un valor exacto o un rango, y esa columna es la más selectiva, ya restringe las filas candidatas en gran medida.Por otro lado, un índice
(Least, SecondMost, MostSelective)
puede parecer un error, pero en realidad es un índice bastante poderoso. Debido a que tiene laLeast
columna como su consulta más externa, se puede usar para consultas que tienen que agregar resultados en columnas de baja selectividad. Dichas consultas son frecuentes en los almacenes de datos de análisis y OLAP, y aquí es exactamente donde tales índices tienen un muy buen caso para ellos. Dichos índices en realidad son excelentes índices agrupados , exactamente porque organizan el diseño físico en grandes fragmentos de filas relacionadas (el mismoLeast
valor, que generalmente indica algún tipo de categoría o tipo) y facilitan las consultas de análisis.Entonces, desafortunadamente, no hay un orden 'correcto'. No debe seguir ninguna receta de cortador de galletas, sino analizar el patrón de consulta que va a utilizar en esas tablas y decidir qué orden de columna de índice es el correcto.
fuente
Como dice Remus, depende de tu carga de trabajo.
Sin embargo, quiero abordar un aspecto engañoso de la respuesta aceptada.
Para las consultas que realizan una búsqueda de igualdad en todas las columnas del índice, no existe una diferencia significativa.
Lo siguiente crea dos tablas y las completa con datos idénticos. La única diferencia es que una tiene las claves ordenadas de la más selectiva a la menos selectiva y la otra al revés.
Ahora haciendo una consulta en ambas tablas ...
... Ambos usan una multa de índice y ambos reciben exactamente el mismo costo.
El arte ASCII en la respuesta aceptada no es, de hecho, cómo se estructuran los índices. Las páginas de índice para la Tabla 1 se representan a continuación (haga clic en la imagen para abrirla a tamaño completo).
Las páginas de índice contienen filas que contienen la clave completa (en este caso, en realidad hay una columna de clave adicional agregada para el identificador de fila, ya que el índice no se declaró como único, pero se puede descartar más información al respecto aquí ).
Para la consulta anterior, a SQL Server no le importa la selectividad de las columnas. Realiza una búsqueda binaria de la página raíz y descubre que la clave
(PPP...,3,~ )
es>=(JJJ...,1,~ )
y,< (SSS...,3,~ )
por lo tanto, debe leer la página1:118
. Luego realiza una búsqueda binaria de las entradas clave en esa página y localiza la página de hoja para viajar hacia abajo.La alteración del índice en orden de selectividad no afecta ni el número esperado de comparaciones clave de la búsqueda binaria ni el número de páginas que se deben navegar para realizar una búsqueda de índice. En el mejor de los casos, podría acelerar marginalmente la comparación de claves en sí.
Sin embargo, a veces ordenar primero el índice más selectivo tendrá sentido para otras consultas en su carga de trabajo.
Por ejemplo, si la carga de trabajo contiene consultas de las dos formas siguientes.
Los índices anteriores no cubren ninguno de ellos.
MostSelective
es lo suficientemente selectivo como para hacer que un plan con una búsqueda y búsquedas valga la pena, pero la consulta en contraLeast
no lo es.Sin embargo, este escenario (búsqueda de índice no cubriente en el subconjunto de columnas principales de un índice compuesto) es solo una posible clase de consulta que puede ser ayudada por un índice. Si nunca buscas realmente por
MostSelective
sí solo o una combinación deMostSelective, SecondMost
y siempre busca por una combinación de las tres columnas, esta ventaja teórica es inútil para usted.Por el contrario, consultas como
Sería útil contar con el orden inverso al comúnmente recetado, ya que cubre la consulta, puede admitir una búsqueda y devuelve filas en el orden deseado para arrancar.
Por lo tanto, este es un consejo que se repite a menudo, pero a lo sumo es una heurística sobre el beneficio potencial de otras consultas, y no es un sustituto para analizar realmente su carga de trabajo.
fuente
Correcto. Los índices pueden ser compuestos, compuestos de múltiples columnas, y el orden es importante debido al principio más a la izquierda. La razón es que la base de datos verifica la lista de izquierda a derecha y tiene que encontrar una referencia de columna correspondiente que coincida con el orden definido. Por ejemplo, tener un índice en una tabla de direcciones con columnas:
Cualquier consulta que use la
address
columna puede utilizar el índice, pero si la consulta solo tiene referenciascity
y / ostate
referencias, el índice no se puede usar. Esto se debe a que la columna de la izquierda no está referenciada. El rendimiento de la consulta debe indicar cuál es el óptimo: índices individuales o múltiples compuestos con diferentes órdenes. Buena lectura: The Tipping Point , de Kimberley Trippfuente
Todas las otras respuestas son incorrectas.
La selectividad de las columnas individuales en un índice compuesto no importa al elegir el orden.
Aquí está el proceso de pensamiento simple: efectivamente, un índice es la concatenación de las columnas involucradas.
Dando esa razón, la única diferencia es comparar dos 'cadenas' que difieren más temprano que más tarde en la cadena. Esta es una pequeña parte del costo total. No hay "primer pase / segundo pase", como se menciona en una respuesta.
Entonces, ¿qué orden se debe usar?
=
, en cualquier orden.Por ejemplo, la columna de selectividad muy baja debe venir primero en esto:
Cambiar el orden en el índice lo ignoraría por completo
deleted
.(Hay muchas más reglas para ordenar las columnas).
fuente
deleted
no ayuda mucho a filtrar las filas no deseadas. ¿Tienes un mejor ejemplo? (Esa fue la que me vino a la mente cuando escribí la respuesta.)