Cada vez que inserto manualmente una fila en una tabla en SQL Server Management Studio 2008 (la base de datos es SQL Server 2005), mi nueva fila aparece en la parte SUPERIOR de la lista en lugar de en la parte inferior. Estoy usando columnas de identidad y esto da como resultado cosas como
id row
42 first row
1 second row
2 third row
Cuando se obtienen filas y no se ordenan explícitamente. Esto da como resultado una apariencia diferente cuando se obtienen las filas para la aplicación web y cambia lo que TOP 1
devuelve una consulta.
Sé que puedo order by
, pero ¿por qué sucede esto? La mayoría de mis datos se insertan a través de una aplicación web, todas las inserciones de esta aplicación dan como resultado un pedido Primero en entrar, primero en salir, por ejemplo, la última inserción está en la parte inferior, por lo que los identificadores están todos en una fila. ¿Hay alguna configuración en el servidor o Management Studio que provoque este pedido incorrecto?
fuente
Respuestas:
En el mundo SQL, el orden no es una propiedad inherente de un conjunto de datos. Por lo tanto, no obtiene garantías de su RDBMS de que sus datos volverán en un cierto orden, o incluso en un orden consistente, a menos que consulte sus datos con una
ORDER BY
cláusula.De Craig Freedman :
Úselo siempre
ORDER BY
si espera un orden bien definido y consistente en su conjunto de resultados. Nunca confíe en cómo su base de datos puede almacenar las filas en el disco (por ejemplo, a través de un índice agrupado) para garantizar un cierto orden de datos en sus consultas.fuente
Solo para aumentar las otras respuestas: una tabla es, por definición, un conjunto desordenado de filas. Si no especifica una
ORDER BY
cláusula, SQL Server puede devolver las filas en el orden que considere más eficiente. Esto suele coincidir con el orden de inserción, ya que la mayoría de las tablas tienen un índice agrupado de identidad, fecha y hora u otras columnas que aumentan monotónicamente, pero debe tratarlo exactamente así: una coincidencia. Puede cambiar con nuevos datos, una actualización de estadísticas, una marca de seguimiento, cambios en maxdop, sugerencias de consulta, cambios en las cláusulas de unión o dónde en la consulta, cambios en el optimizador debido a un paquete de servicio / actualización acumulativa / revisión / actualización, mover la base de datos a un servidor diferente, etc. etc.En otras palabras, y sé que ya sabes la respuesta, pero no se puede decir lo suficiente:
fuente
select
declaracionesEs porque la tabla es una tabla de montón (muy probablemente) y no está indexada. Hacer que el identificador de columna de una
PRIMARY KEY
, así comoIDENTITY
. SQL Server almacena físicamente los datos en función de los índices; por ejemplo, si la identificación fuera un índice agrupado (como una clave primaria), los datos se almacenarían físicamente en el orden de los identificadores y se devolverían de esa manera en una consulta incluso sin unaORDER BY
cláusula De lo contrario, el orden de las filas no es importante para la base de datos. En consecuencia, tener una aplicación depende del orden de las filas en la base de datos (así como también dependiendo de que las columnas estén en cierto orden) no es una buena práctica. La aplicación necesita trabajar con cualquier clave que haya en la base de datos para identificar filas.fuente
order by
(es una aplicación heredada con una gran cantidad de malas prácticas), pero me preguntaba exactamente por qué sucedió.SELECT *
noORDER BY
podría volver a aparecer en el orden "correcto" (pero todavía no se puede garantizar)?ORDER BY
cláusula es una garantía mucho mejor (no importa mucho menos perjudicial) que hacer cambios en el esquema de la tabla y esperar que el pedido sea como espera, para siempre.