¿Existe una forma sucinta de recuperar un registro aleatorio de una tabla de servidor sql?
Sí
SELECT TOP 1 * FROM table ORDER BY NEWID()
Explicación
Un NEWID()
se genera para cada fila y luego la tabla se ordena por ella. Se devuelve el primer registro (es decir, el registro con el GUID "más bajo").
Notas
-
Los GUID se generan como números pseudoaleatorios desde la versión cuatro:
El UUID de la versión 4 está diseñado para generar UUID a partir de números verdaderamente aleatorios o pseudoaleatorios.
El algoritmo es el siguiente:
- Establezca los dos bits más significativos (bits 6 y 7) de theclock_seq_hi_and_reserved a cero y uno, respectivamente.
- Establezca los cuatro bits más significativos (bits 12 a 15) del campo time_hi_and_version al número de versión de 4 bits de la Sección 4.1.3.
- Establezca todos los demás bits en valores elegidos aleatoriamente (o pseudoaleatoriamente).
—Un espacio de nombres URN de identificador único universal (UUID) - RFC 4122
-
La alternativa
SELECT TOP 1 * FROM table ORDER BY RAND()
no funcionará como uno pensaría.RAND()
devuelve un único valor por consulta, por lo que todas las filas compartirán el mismo valor. -
Si bien los valores de GUID son pseudoaleatorios, necesitará un PRNG mejor para las aplicaciones más exigentes.
-
El rendimiento típico es de menos de 10 segundos para alrededor de 1 000 000 de filas, por supuesto, dependiendo del sistema. Tenga en cuenta que es imposible alcanzar un índice, por lo que el rendimiento será relativamente limitado.