sql >> Base de Datos >  >> RDS >> Sqlserver

Determinar la última fila agregada cuando no hay índice presente

No, no hay una función predefinida en SQL Server que devuelva la "última fila" de una tabla.

Por definición, una tabla es un conjunto desordenado de filas. Imagina que arrojas un montón de canicas en una bolsa. Ahora abre la bolsa y pregúntale a otra persona qué canica entró primero o cuál fue la última. Ahora tírelos todos al suelo, y cuando alguien más entre en la habitación, pregúntele cuál golpeó el suelo primero o último. No puedes hacerlo, porque no hay información adicional que indique nada sobre el orden en que cayeron.

Lo mismo es cierto para una tabla en SQL Server. A menos que agregue una columna de IDENTIDAD, o una columna de fecha y hora, o un disparador, o use una funcionalidad externa como seguimiento de cambios, CDC, auditoría, etc., SQL Server no tiene forma de decirle qué fila se insertó en último lugar. Puedes pensar que simplemente seleccionando de la tabla sin una orden por cláusula aspectos como si estuviera devolviendo datos en el orden correcto, esto es pura coincidencia. Aquí hay un ejemplo:

CREATE TABLE dbo.floobat
(
  ID INT PRIMARY KEY, 
  n VARCHAR(16), 
  x CHAR(4000) NOT NULL DEFAULT ''
);

INSERT dbo.floobat(ID,n) VALUES(1,'Sparky');
INSERT dbo.floobat(ID,n) VALUES(2,'Aaron');
INSERT dbo.floobat(ID,n) VALUES(3,'Norbert'); -- <-- inserted last

SELECT ID, n FROM dbo.floobat;

Ok, por defecto, esto parece estar bien. Resultados:

ID    n
--    -------
1     Sparky
2     Aaron
3     Norbert -- < yes, this is right

Sin embargo, hagamos un cambio en la tabla de la que su aplicación o cualquier otra cosa que dependa del orden anterior no tendrá idea:

CREATE NONCLUSTERED INDEX x ON dbo.floobat(n);

SELECT ID, n FROM dbo.floobat;

¡UH oh! Resultados:

ID    n
--    -------
2     Aaron
3     Norbert
1     Sparky -- < oops, this is no longer right

Debe recordar esto:si no incluye una cláusula ORDER BY, está diciendo SQL Server que no te importa el orden. Por lo tanto, encontrará la forma más eficiente de devolver los datos, y eso podría conducir a un orden observado diferente. Agregar el índice anterior le dio a SQL Server una mejor ruta de acceso para recuperar los datos. Todavía usaba un escaneo, pero ese índice era mucho más delgado que el índice agrupado (que solo podía caber en dos filas en una página).

Incluso sin el índice, es probable que no obtenga los resultados esperados, ya que se complica por el hecho de que su Cust_ID la columna no se inserta en orden ascendente. Entonces, si inserta 5 y que 2 , seleccionar sin ORDER BY resultará en 2 entonces 5 (suponiendo que no exista un mejor índice).

Otras cosas además de crear (o eliminar, cambiar o reconstruir) un índice pueden causar el mismo tipo de cambio en el comportamiento de pedido. Aplicar un paquete de servicio, CU o hotfix; vaciar la caché de procedimientos; usando varias opciones de RECOMPILE; actualización de estadísticas; reiniciar el servidor; agregar o deshabilitar una marca de seguimiento; cambiar las opciones de una opción de servidor; mover la base de datos a un servidor diferente; etc. etc.

Por lo tanto, si desea realizar un seguimiento de esta información, deberá agregarla usted mismo de alguna manera, como se ha abordado en varias de las otras respuestas.