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 al azar en grupos de discusión, se propone la consulta NEWID; es simple y funciona muy bien para tablas pequeñas.
SELECT TOP 10 PERCENT *
FROM Table1
ORDER BY NEWID()
Sin embargo, la consulta NEWID tiene un gran inconveniente cuando se utiliza 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 utilizar muchas E/S de disco y puede funcionar durante un tiempo prolongado.
- En el peor de los casos, tempdb puede quedarse sin espacio. En el mejor escenario de , tempdb puede ocupar una gran cantidad de espacio en disco que nunca será recuperado sin un comando de contracción manual.
Lo que necesita es una forma de seleccionar filas al azar que no utilizará tempdb y no se hará mucho más lenta a medida que la tabla se agranda. He aquí una nueva idea sobre cómo hacerlo:
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 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 cuyo número aleatorio es menor que 10.
Lea el artículo completo en MSDN.
MSDN tiene un buen artículo que cubre una gran cantidad de estos temas: [Seleccionar filas al azar de una mesa grande] (https://msdn.microsoft.com/en-us/library/cc441928.aspx) – KyleMit
Posible duplicado de [¿Cómo solicitar una fila aleatoria en SQL?] (http://stackoverflow.com/questions/19412/how- to-request-a-random-row-in-sql) –