Esiste un modo conciso per recuperare un record casuale da una tabella del server sql?
Sì
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
-
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
-
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. -
Sebbene i valori GUID siano pseudocasuali, avrai bisogno di un PRNG migliore per le applicazioni più impegnative.
-
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.