¿Por qué SSMS inserta filas nuevas en la parte superior de una tabla y no en la parte inferior?


9

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 la parte inferior.Estoy usando columnas de identidad y esto resulta en cosas como

id row
42 first row
1 second row
2 third row

Cuando las filas son recuperadas y no ordenadas explícitamente.Esto da lugar a una apariencia diferente cuando se obtienen las filas para la aplicación web y cambia lo que unTOP 1consulta devuelve.

Sé que puedoorder byellos, pero porque esta pasando 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 Primero en Salir, por ejemplo, el último inserto 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 cause este pedido incorrecto?

  0

Como he visto a veces, depende de la forma en que PK se muestre cómo se muestran las filas, si selecciona una sola tabla.Si realiza algunas combinaciones, puede cambiar dependiendo de las otras tablas PK, FK e índices ... 18 jul. 132013-07-18 22:00:36

  0

Tenga en cuenta también las exploraciones [merry-go-round] (http://technet.microsoft.com/en-us/library/ms191475%28v=sql.105%29.aspx). 01 abr. 152015-04-01 03:49:03

17

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 orden determinado, o incluso en un orden consistente, a menos que consulte sus datos con una cláusula ORDER BY .

Desde Craig Freedman :

La combinación de TOP con ORDER BY agrega determinismo al conjunto de filas devueltas.Sin ORDER BY, el conjunto de filas devueltas depende del plan de consulta e incluso puede variar de una ejecución a otra.

Siempre use 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.


0

Esto se debe a que la tabla es una tabla de almacenamiento dinámico (lo más probable) y no está indexada.Haga que la columna de ID sea un PRIMARY KEY , así como IDENTITY .SQL Server almacena físicamente los datos en función de los índices; por ejemplo, si id era un índice agrupado (como una clave principal), 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 una cláusula ORDER BY .De lo contrario, el orden de las filas no es importante para la base de datos en absoluto.En consecuencia, no es una buena práctica tener una aplicación que dependa del orden de las filas en la base de datos (así como de que las columnas estén en un orden determinado).La aplicación necesita trabajar con cualquier clave que haya en la base de datos para identificar las filas.

  0

Bueno saber.Sabía que esta era una sugerencia para cambiar la aplicación para usar 'orden por' (es una aplicación heredada con mucha mala práctica) pero me preguntaba exactamente por qué sucedió. 14 sep. 112011-09-14 19:49:38

+4

¿Cambia la estructura de la tabla solo para que 'SELECT *' sin 'ORDER BY' *** pueda volver a aparecer en el orden" correcto "(pero aún no esté garantizado)? 14 sep. 112011-09-14 20:22:26

  0

En un SELECT simple de la tabla con un índice agrupado volvería en el orden del índice agrupado.No estaba tan claro como debería haber sido que era una ilustración de cuándo los datos se ordenan físicamente por una columna en particular, pero definitivamente no es un hecho que en cada consulta se devolvería correctamente.Mea culpa. 14 sep. 112011-09-14 20:27:39

+4

Realmente no importa lo que es el índice agrupado.SQL Server aún puede devolver el pedido en función de algún otro índice basado en una amplia variedad de factores.La creación de una clave principal en alguna columna *** NO SÍ *** garantiza que las selecciones sin orden regresarán repentinamente ordenadas por esa columna siempre.¿Podrías observar eso la mayor parte del tiempo?Por supuesto.Pero eso no es lo mismo que una garantía.Nunca he visto un oso polar en mi calle, pero no hay un campo de fuerza de oso polar que evite que suceda. 14 sep. 112011-09-14 20:41:09

+3

De todos modos, mi punto fue que agregar una cláusula 'ORDER BY' es una garantía mucho mejor (no importa mucho menos perturbadora) que hacer cambios de esquema en la tabla y * esperando * que la ordenación sea como espera, para siempre. 14 sep. 112011-09-14 20:42:25


10

Solo para aumentar las otras respuestas: una tabla es, por definición, un conjunto de filas no ordenadas.Si no especifica una cláusula ORDER BY , SQL Server es libre de devolver las filas en el orden que considere más eficiente.A menudo, esto solo coincidirá con el orden de inserción, ya que la mayoría de las tablas tienen un índice agrupado en identidad, fecha y hora u otras columnas que aumentan de forma monotónica, pero debe tratarlo exactamente como eso: una coincidencia.Puede cambiar con nuevos datos, una actualización de estadísticas, un indicador de seguimiento, cambios en maxdop, sugerencias de consulta, cambios en la unión o cláusulas de 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:

Si desea confiar en el orden de una consulta, SIEMPRE agregueORDER BY .

  0

No estaba planeando dependiendo del pedido, pero visualmente es un poco molesto que mis últimos artículos insertados estén repentinamente en la parte superior. 14 sep. 112011-09-14 20:18:15

  0

Supongo que esto es porque estás usando Open Table.En Management Studio 2008, este comando se ha desviado a "Editar filas n principales" y "Seleccionar filas N superiores": cuando elige esta última, puede editar la consulta resultante, por ejemplo, eliminar la parte superior y agregar una orden. 14 sep. 112011-09-14 20:21:07

  0

Es Management studio 2008, el servidor es 2005, debería haber sido más claro.No sabía que había un comando de "mesa abierta", siempre he usado las declaraciones 'select' 14 sep. 112011-09-14 20:36:30

+4

Ok, bueno, el punto sigue en pie, entiendo que es molesto que los datos regresen en un orden que no esperas, pero espero que ahora quede claro por qué a SQL Server no le importa qué orden esperas * a menos que * le digas eso te importa añadiendo una orden por cláusula.:-) 14 sep. 112011-09-14 20:37:35