Este enlace tiene una comparación interesante entre Orderby (NEWID ()) y otros métodos para tablas con 1, 7 y 13 millones de filas.
A menudo, cuando se hacen preguntas sobre cómo seleccionar filas aleatorias en grupos de discusión, se propone la consulta NEWID; Es simple y funciona muy bien para mesas pequeñas.
SELECT TOP 10 PERCENT *
FROM Table1
ORDER BY NEWID()
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 causa 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 ejecutarse 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 disco que nunca será reclamado sin un comando de reducción manual.
Lo que necesita es una forma de seleccionar filas al azar que no usen tempdb y no se volverán mucho más lentas a medida que la tabla se agrande. Aquí hay una nueva idea sobre cómo hacer eso:
SELECT * FROM Table1
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 todas esas 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 cuyo número aleatorio es menor que 10.
Por favor, lea el artículo completo en MSDN .