"pedir por newid()" - ¿cómo funciona?
Lo sé si ejecuto esta consulta
select top 100 * from mytable order by newid()
Obtendrá 100 registros aleatorios de mi tabla.
Sin embargo, estoy un poco confundido en cuanto a cómo funciona, ya que no lo veo newid()
en la select
lista. ¿Alguien puede explicar? ¿ Hay algo especial newid()
aquí?
Sé lo que hace NewID(), solo estoy tratando de entender cómo ayudaría en la selección aleatoria. ¿Es que (1) la declaración de selección seleccionará TODO de mytable, (2) para cada fila seleccionada, agregará un identificador único generado por NewID(), (3) ordenará las filas por este identificador único y (4) seleccionará la parte superior? ¿100 de la lista ordenada?
Sí. esto es bastante correcto (excepto que no necesariamente es necesario ordenar todas las filas). Puede verificar esto mirando el plan de ejecución real.
SELECT TOP 100 *
FROM master..spt_values
ORDER BY NEWID()
El operador escalar de cálculo agrega la NEWID()
columna para cada fila (2506 en la tabla de mi consulta de ejemplo), luego las filas de la tabla se ordenan por esta columna con las 100 primeras seleccionadas.
SQL Server en realidad no necesita ordenar todo el conjunto desde las posiciones 100 hacia abajo, por lo que utiliza un TOP N
operador de clasificación que intenta realizar toda la operación de clasificación en la memoria ( para valores pequeños deN
)
En general funciona así:
- Todas las filas de mytable están "en bucle"
- NEWID() se ejecuta para cada fila
- Las filas se ordenan según un número aleatorio de NEWID()
- Se seleccionan 100 de la primera fila.
como dice MSDN :
NewID() Crea un valor único de tipo identificador único.
y su tabla se ordenará según estos valores aleatorios.