El La clave aquí es la función NEWID, que genera un identificador global único (GUID) en la memoria para cada fila. Por definición, el GUID es único y bastante aleatorio; entonces, cuando ordena por ese GUID con la cláusula ORDER BY, obtiene un orden aleatorio de las filas en la tabla. Tomando el 10 por ciento superior (o el porcentaje que desee) le dará un muestreo aleatorio de las filas en la tabla.
Se propone la consulta NEWID; es simple y funciona muy bien para tablas pequeñas. Sin embargo, la consulta NEWID tiene un gran inconveniente cuando la usa para tablas grandes. La cláusula ORDER BY hace que todas las filas de la tabla se copien en la base de datos tempdb, donde se ordenan. Esto ocasiona dos problemas: La operación de clasificación generalmente tiene un alto costo asociado. La ordenación puede usar muchas E/S de disco y puede funcionar durante mucho tiempo. En el peor de los casos, tempdb puede quedarse sin espacio. En el mejor de los casos, tempdb puede ocupar una gran cantidad de espacio en el disco que nunca se recuperará sin un comando de contracción manual. Lo que necesita es una forma de seleccionar filas al azar que no usará tempdb y que no será mucho más lenta a medida que la tabla se agranda. He aquí una nueva idea sobre cómo hacerlo:
SELECT * FROM master..spt_values
WHERE (ABS(CAST(
(BINARY_CHECKSUM(*) *
RAND()) as int)) % 100) < 10
La idea básica detrás de esta consulta es que queremos generar un número aleatorio entre 0 y 99 para cada fila de la tabla, y luego elegir todos los filas cuyo número aleatorio es menor que el valor del porcentaje especificado. En este ejemplo, queremos aproximadamente el 10 por ciento de las filas seleccionadas al azar; Por lo tanto, elegimos todas las filas cuyos números aleatorios es inferior a 10.
Tenga en cuenta que esta es una manera lenta para obtener 100 entradas al azar a menos que el servidor reconoce db esto como un patrón conocido para optimizar. – CodesInChaos
También es solo pseudoaleatorio. Si necesita aleatoriedad verdadera para la seguridad, nunca use este método. –
Las columnas en su cláusula 'ORDER BY' no necesitan aparecer en su cláusula' SELECT' en SQL Server. – Gabe