Cuando crea un índice en una columna o número de columnas en MS SQL Server (estoy usando la versión 2005), puede especificar que el índice en cada columna sea ascendente o descendente. Me cuesta entender por qué esta opción está aquí. Usando técnicas de ordenamiento binario, ¿no sería una búsqueda tan rápida en ambos sentidos? ¿Qué diferencia hace qué orden elijo?
sql
sql-server
optimization
indexing
Joshua Carmody
fuente
fuente
Respuestas:
Esto es principalmente importante cuando se usa con índices compuestos:
se puede usar para:
o:
, pero no para:
Un índice en una sola columna se puede usar de manera eficiente para ordenar de ambas maneras.
Vea el artículo en mi blog para más detalles:
Actualizar:
De hecho, esto puede importar incluso para un índice de una sola columna, aunque no es tan obvio.
Imagine un índice en una columna de una tabla agrupada:
El índice en
col1
mantiene valores ordenadoscol1
junto con las referencias a filas.Como la tabla está agrupada, las referencias a las filas son en realidad los valores de
pk
. También se ordenan dentro de cada valor decol1
.Esto significa que las hojas del índice están realmente ordenadas
(col1, pk)
y esta consulta:No necesita clasificación.
Si creamos el índice de la siguiente manera:
, los valores de
col1
se ordenarán de forma descendente, pero los valores depk
dentro de cada valor decol1
se ordenarán de forma ascendente.Esto significa que la siguiente consulta:
puede ser servido por
ix_mytable_col1_desc
pero no porix_mytable_col1
.En otras palabras, las columnas que constituyen un
CLUSTERED INDEX
en cualquier tabla son siempre las columnas finales de cualquier otro índice en esa tabla.fuente
Para un verdadero índice de una sola columna, hace poca diferencia desde el punto de vista del Optimizador de consultas.
Para la definición de la tabla
La consulta
Utiliza un escaneo ordenado con dirección de escaneo
BACKWARD
como se puede ver en el Plan de ejecución. Sin embargo, existe una ligera diferencia en que actualmente solo losFORWARD
escaneos pueden ser paralelos.Sin embargo , puede hacer una gran diferencia en términos de fragmentación lógica . Si el índice se crea con claves descendentes pero se agregan nuevas filas con valores de claves ascendentes, entonces puede terminar con cada página fuera de orden lógico. Esto puede afectar gravemente el tamaño de las lecturas de E / S al escanear la tabla y no está en caché.
Ver los resultados de fragmentación
para el guión a continuación
Es posible usar la pestaña de resultados espaciales para verificar la suposición de que esto se debe a que las páginas posteriores tienen valores clave ascendentes en ambos casos.
fuente
El orden de clasificación es importante cuando desea recuperar muchos datos ordenados, no registros individuales.
Tenga en cuenta que (como sugiere con su pregunta) el orden de clasificación suele ser mucho menos significativo que las columnas que está indexando (el sistema puede leer el índice al revés si el orden es opuesto a lo que quiere). Raramente pienso en el orden de clasificación, mientras que me preocupan las columnas cubiertas por el índice.
@Quassnoi proporciona un gran ejemplo de cuando no importa.
fuente