Come vengono ordinati i risultati di SQL Server quando vengono utilizzati i join?


10

In che modo SQL Server rileva l'ordine dei record nel set di risultati dell'esecuzione della query?

Sto provando a crearne la testa o la coda ma mi ritrovo a grattarmi la testa. Quando cambio i campi sto selezionando anche l'ordine cambia. Quando eseguo il codice SQL di seguito con un SELECT *ottengo gli stessi record ma in un ordine molto diverso.

 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'

6
Un paio di commenti / domande: (1) perché usare il pulsante turbo magico della polvere di folletto NOLOCK su un solo tavolo? Hai mai pensato di usare RCSI invece di voodoo? (2) perché non stai usando i prefissi di schema corretti? Per il primo, cerca nel Web NOLOCK: vedrai tutti i tipi di motivi per cui non dovresti usarlo. Per quest'ultimo, vedi sqlblog.com/blogs/aaron_bertrand/archive/2009/10/11/…
Aaron Bertrand

RCSI? per favore, spiega ...
Kacalapy il

2
RCSI = Leggi isolamento istantanea commesso. Vedi stackoverflow.com/questions/816650/…
Aaron Bertrand

Senza una ORDER BYclausola, SQL Server (e qualsiasi altro RDBMS) fa quello che sembra .
Nick Chammas,

Risposte:


17

Dal momento che non hai detto a SQL Server come ordinare i risultati, è libero di farlo in qualunque sia il più efficiente. In questo modo dipenderà da qual è il più economico da ordinare e le colonne selezionate lo guideranno perché dipende a sua volta dall'indice (i) più economico da utilizzare per ottenere le informazioni richieste dalla query. Questo può cambiare da un'esecuzione all'altra non solo cambiando il testo della query, ma anche con cambiamenti di dati, aggiornamenti delle statistiche, programmi liberi, service pack, hotfix, ecc. Ciò è particolarmente volatile con così tante tabelle coinvolte se i dati sottostanti cambiano rapidamente , come tende a fare nelle applicazioni OLTP.

Se desideri un ordine prevedibile, perché non utilizzarlo ORDER BYnella query? Come scritto, l'SQL specifica che ogni 900 righe sono accettabili, in qualsiasi ordine.

Anche se, in molti casi, vedi lo stesso ordine più volte per la stessa query, non c'è garanzia se non lo dici ORDER BY <something>.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.