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

Record casuale da una tabella di database (T-SQL)

Esiste un modo conciso per recuperare un record casuale da una tabella del server sql?

SELECT TOP 1 * FROM table ORDER BY NEWID()

Spiegazione

Un NEWID() viene generato per ogni riga e la tabella viene quindi ordinata in base ad essa. Viene restituito il primo record (ovvero il record con il GUID "più basso").

Note

  1. I GUID sono generati come numeri pseudocasuali dalla versione quattro:

    L'UUID versione 4 è pensato per generare UUID da numeri veramente casuali o pseudocasuali.

    L'algoritmo è il seguente:

    • Imposta i due bit più significativi (bit 6 e 7) di clock_seq_hi_and_reserved rispettivamente a zero e uno.
    • Imposta i quattro bit più significativi (bit da 12 a 15) del campo time_hi_and_version sul numero di versione a 4 bit della Sezione 4.1.3.
    • Imposta tutti gli altri bit su valori scelti casualmente (o pseudo-casuali).

    —Uno spazio dei nomi URN (Universally Unique IDentifier) ​​- RFC 4122

  2. L'alternativa SELECT TOP 1 * FROM table ORDER BY RAND() non funzionerà come si potrebbe pensare. RAND() restituisce un unico valore per query, quindi tutte le righe condivideranno lo stesso valore.

  3. Sebbene i valori GUID siano pseudocasuali, avrai bisogno di un PRNG migliore per le applicazioni più impegnative.

  4. Le prestazioni tipiche sono inferiori a 10 secondi per circa 1.000.000 di righe, ovviamente a seconda del sistema. Tieni presente che è impossibile raggiungere un indice, quindi la performance sarà relativamente limitata.