2009-03-16 19 views
19

En el servidor Sql, tengo una tabla con una clave principal de identidad. A menudo quiero los últimos nuevos registros, así que tomo el Top n ordenado al descender la clave principal. ¿Debo definir el índice de clave principal como descendente, o no hace ninguna diferencia? es decir, si están en orden ascendente, ¿puede sql igualmente funcionar de manera eficiente al revés?Clave principal ascendente vs descendente

+0

No deberías ** no ** crearlo como 'desc'. Obtendrá mucha fragmentación lógica de las inserciones [como se muestra aquí] (http://stackoverflow.com/a/9382500/73226) –

Respuesta

30

Desde un punto de vista puramente consulta, no hace ninguna diferencia si su clave es descendente o ascendente si quieres tirar de N más reciente o N registros más antiguos:

los algoritmos internos de SQL Server puede navegar por igual de manera eficiente en ambas direcciones en un índice de una sola columna, independientemente de la secuencia en que se almacenan las claves. Por ejemplo, especificar DESC en un índice de una sola columna no hace que las consultas con una cláusula ORDER BY IndexKeyCol DESC se ejecuten más rápidamente que si se especificara ASC para el índice.

http://msdn.microsoft.com/en-us/library/aa933132(SQL.80).aspx

Sin embargo bajo casi cualquier circunstancia normal, de su clave primaria a ser ascendente y ordinalmente secuencial para evitar la fragmentación. SQL Server está optimizado para agregar nuevos registros físicamente al final del archivo de base de datos. Si necesita insertar cada nuevo registro en la parte superior y empujar todo hacia abajo, probablemente dé como resultado una fragmentación de casi el 100%.

3

No hace absolutamente ninguna diferencia.

Ni siquiera puedo imaginar por qué es posible declararlo de cualquier manera.

+3

Con un índice de una sola columna, no importa, pero ASC y DESC entran en juego cuando tiene varias columnas en el índice, y el orden es importante para la segunda/tercera/cuarta/columna etc. –

+0

Esto no tiene sentido para mí. Si tiene dos valores de campo, la forma en que desciende del árbol es completamente indiferente. ¿Es solo una suposición, o tienes una referencia? – dkretz

+0

tiene sentido para mí. Si tiene un índice declarado 'A ASC, B DESC' pero la mayoría de sus consultas son' ORDER BY A ASC, B ASC' que no evitará una clasificación. –

Cuestiones relacionadas