Como o SQL Server descobre a ordem dos registros no conjunto de resultados da execução da consulta?
Estou tentando fazer cara ou coroa, mas me pego coçando a cabeça. Quando altero os campos que estou selecionando a ordem também muda. Quando executo o SQL abaixo com a SELECT *
, obtenho os mesmos registros, mas em uma ordem muito 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'
Como você não disse ao SQL Server como ordenar os resultados, ele é livre para fazê-lo da maneira mais eficiente. Desta forma, dependerá de qual é o mais barato para classificar, e as colunas que você selecionar irão direcionar isso porque, por sua vez, depende do(s) índice(s) mais barato(s) a ser(em) usado(s) para obter as informações solicitadas pela consulta. Isso pode mudar de execução para execução, não apenas alterando o texto da consulta, mas também por coisas como alterações de dados, atualizações de estatísticas, freeproccache, service packs, hotfixes, etc. Isso é especialmente volátil com tantas tabelas envolvidas se os dados subjacentes estiverem mudando rapidamente , como costuma acontecer em aplicativos OLTP.
Se você deseja uma ordem previsível, por que não usa
ORDER BY
na consulta? Conforme escrito, o SQL especifica que quaisquer 900 linhas são aceitáveis, em qualquer ordem.Mesmo que, em muitos casos, você veja o mesmo pedido repetidamente para a mesma consulta, não há garantia, a menos que você diga
ORDER BY <something>
.