¿Cómo calcula SQL Server el orden de los registros en el conjunto de resultados de la ejecución de la consulta?
Estoy tratando de hacer cara o cruz, pero me encuentro rascándome la cabeza. Cuando cambio los campos que estoy seleccionando, el orden también cambia. Cuando ejecuto el siguiente SQL con un SELECT *
, obtengo los mismos registros pero en un orden muy diferente.
SELECT TOP (900)
AD.ATTACHMENTID,
AD.NAME,
AD.ISINLINE,
AD.INSERTEDDATETIME,
ATMT.ATTACHMENTBLOB,
U.UFID
FROM ATTACHMENTDETAIL AD WITH (NOLOCK)
INNER JOIN MESSAGEATTACHMENT MA ON MA.ATTACHMENTID = AD.ATTACHMENTID
INNER JOIN ATTACHMENT ATMT ON ATMT.ATTACHMENTID = AD.ATTACHMENTID
INNER JOIN MESSAGE MSG ON MSG.ID = MA.MESSAGEID
INNER JOIN MESSAGEDETAIL MD ON MD.MESSAGEID = MA.MESSAGEID
INNER JOIN [USER] U ON U.ID = MD.USERID
LEFT OUTER JOIN XmlExtractionMapping XM ON MA.MESSAGEID = XM.MessageId
WHERE AD.FILEBOXTOKEN IS NULL
AND (XM.XMLEXTRACTIONDATE IS NOT NULL OR
(MSG.MESSAGESOURCEID = 1 AND MD.FolderId <> -4))
AND AD.ISINLINE = 'FALSE'
sql-server
order-by
kacalapy
fuente
fuente
NOLOCK
: verá todo tipo de razones por las que no debería usarlo. Para lo último, consulte sqlblog.com/blogs/aaron_bertrand/archive/2009/10/11/…ORDER BY
cláusula, SQL Server (y cualquier otro RDBMS) hace lo que se siente .Respuestas:
Como no le ha dicho a SQL Server cómo ordenar los resultados, es gratis hacerlo en lo que sea más eficiente. De esta manera, dependerá de cuál sea el más barato para ordenar, y las columnas que seleccione lo impulsarán porque a su vez depende de los índices más baratos que se usarán para obtener la información solicitada por la consulta. Esto puede cambiar de ejecución en ejecución no solo cambiando el texto de la consulta sino también por cosas como cambios de datos, actualizaciones de estadísticas, freeproccache, service packs, hotfixes, etc. Esto es especialmente volátil con tantas tablas involucradas si los datos subyacentes cambian rápidamente , como suele hacer en las aplicaciones OLTP.
Si desea un orden predecible, ¿por qué no lo utiliza
ORDER BY
en la consulta? Como está escrito, está previsto por SQL que cualquier 900 filas son aceptables, en cualquier orden.Aunque, en muchos casos, ve el mismo orden una y otra vez para la misma consulta, no hay garantía a menos que usted lo indique
ORDER BY <something>
.fuente