Como o SQL Server solicita resultados quando as junções são usadas?

10

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 encontro coçando a cabeça. Quando altero os campos, seleciono 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'
kacalapy
fonte
6
Alguns comentários / perguntas: (1) por que usar o botão turbo mágico NOLOCK de poeira de pixie em apenas uma mesa? Você já pensou em usar o RCSI em vez do vodu? (2) por que você não está usando prefixos de esquema adequados? No primeiro, pesquise na web NOLOCK- você verá todos os tipos de razões pelas quais não deveria usá-lo. Para o último, consulte sqlblog.com/blogs/aaron_bertrand/archive/2009/10/11/…
Aaron Bertrand
RCSI? por favor, explique ...
kacalapy
2
RCSI = Ler isolamento de instantâneo confirmado. Veja stackoverflow.com/questions/816650/…
Aaron Bertrand
Sem uma ORDER BYcláusula, o SQL Server (e qualquer outro RDBMS) faz o que parece .
Nick Chammas

Respostas:

17

Como você não disse ao SQL Server como solicitar os resultados, é livre fazê-lo da maneira mais eficiente. Dessa maneira, dependerá do que é o mais barato para classificar, e as colunas que você selecionar o conduzirão porque, por sua vez, depende dos índices mais baratos a serem usados ​​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 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 estão mudando rapidamente , como costuma fazer nos aplicativos OLTP.

Se você deseja um pedido previsível, por que não usa ORDER BYna consulta? Conforme escrito, o SQL especifica que quaisquer 900 linhas são aceitáveis, em qualquer ordem.

Mesmo que, em muitos casos, você veja a mesma ordem repetidamente para a mesma consulta, não há garantia, a menos que você diga ORDER BY <something>.

Aaron Bertrand
fonte