¿Cómo ordena los resultados de SQL Server cuando se usan combinaciones?

10

¿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'
kacalapy
fuente
66
Un par de comentarios / preguntas: (1) ¿por qué usar el botón turbo mágico de polvo de duendecillo NOLOCK en una sola mesa? ¿Has considerado usar RCSI en lugar de vudú? (2) ¿por qué no usas los prefijos de esquema adecuados? Para el primero, busque en la web 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/…
Aaron Bertrand
RCSI? por favor explique ...
kacalapy
2
RCSI = Lectura de aislamiento de instantánea comprometida. Ver stackoverflow.com/questions/816650/…
Aaron Bertrand
Sin una ORDER BYcláusula, SQL Server (y cualquier otro RDBMS) hace lo que se siente .
Nick Chammas

Respuestas:

17

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 BYen 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>.

Aaron Bertrand
fuente