La aparición de un conjunto de resultados ordenado, sin una ORDER BY
cláusula, a menudo resulta de un escaneo que recupera filas en orden de índice. Una razón por la que generalmente se elige una exploración de orden de índice bajo el READ COMMITTED
nivel de aislamiento predeterminado es que reduce las posibilidades de anomalías de concurrencia no deseadas, como encontrar la misma fila varias veces o omitir por completo algunas filas. Esto se detalla en varios lugares, incluso en esta serie de artículos sobre niveles de aislamiento.
Con una NOLOCK
sugerencia de tabla, este comportamiento es relajado y el acceso a la tabla se realiza bajo el READ UNCOMMITTED
nivel de aislamiento más tolerante , que puede escanear datos en orden de asignación en lugar de orden de índice. Como se describe en ese enlace, la decisión sobre si utilizar una exploración de orden de asignación o de orden de índice se deja al motor de almacenamiento. Esta opción puede cambiar entre ejecuciones sin un cambio en el plan de consulta .
Esto puede sonar muy abstracto, pero se puede demostrar más fácilmente con algunas consultas utilizando funciones no documentadas en la base de datos AdventureWorks2012 .
USE AdventureWorks2012;
GO
-- Appears to be ordered by BusinessEntityID
-- File:Page:Slot goes up and down several times
-- Show physical locations with sys.fn_PhysLocFormatter (undocumented)
SELECT
P.BusinessEntityID,
[(File:Page:Slot)] =
sys.fn_PhysLocFormatter(%%physloc%%)
FROM Person.Person AS P;
-- Same query with TABLOCK or NOLOCK
-- Allocation-order (IAM) scan
-- Now appears to be ordered by File:Page:Slot instead of BusinessEntityID
SELECT P.BusinessEntityID,
[(File:Page:Slot)] =
sys.fn_PhysLocFormatter(%%physloc%%)
FROM Person.Person AS P WITH (NOLOCK);
Las consultas se toman prestadas con una ligera modificación de Paul White .
Finalmente, para ser claros, esta respuesta trata sobre la apariencia de un conjunto de resultados ordenado. No hay orden de presentación garantizada sin un nivel superior ORDER BY
.
Una exploración de orden de asignación puede ocurrir en una variedad de otras circunstancias, como cuando se adquiere un bloqueo a nivel de tabla o la base de datos está en modo de solo lectura. El paralelismo también puede influir en el orden en que se devuelven los datos. El punto clave es que sin ellos ORDER BY
, los datos de los pedidos devueltos pueden variar con el tiempo según el diseño.