Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

order by newid() - come funziona?

So cosa fa NewID(), sto solo cercando di capire come potrebbe aiutare nella selezione casuale. È che (1) l'istruzione select selezionerà TUTTO dalla mia tabella, (2) per ogni riga selezionata, virerà su un identificatore univoco generato da NewID(), (3) ordina le righe in base a questo identificatore univoco e (4) seleziona i primi 100 dall'elenco ordinato ?

Sì. questo è praticamente esattamente corretto (tranne che non è necessario ordinare tutto le righe). Puoi verificarlo guardando il piano di esecuzione effettivo.

SELECT TOP 100 * 
FROM master..spt_values 
ORDER BY NEWID()

L'operatore di calcolo scalare aggiunge NEWID() colonna attiva per ogni riga (2506 nella tabella nella mia query di esempio), quindi le righe nella tabella vengono ordinate in base a questa colonna con le prime 100 selezionate.

SQL Server in realtà non ha bisogno di ordinare l'intero set dalle posizioni 100 in giù, quindi utilizza un TOP N operatore di ordinamento che tenta di eseguire l'intera operazione di ordinamento in memoria (per piccoli valori di N )