"pedir por newid()" - ¿cómo funciona?

Resuelto Tola Odejayi asked hace 14 años • 5 respuestas

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 selectlista. ¿Alguien puede explicar? ¿ Hay algo especial newid()aquí?

Tola Odejayi avatar Feb 13 '11 01:02 Tola Odejayi
Aceptado

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 Noperador de clasificación que intenta realizar toda la operación de clasificación en la memoria ( para valores pequeños deN )

Plan

Martin Smith avatar Feb 12 '2011 21:02 Martin Smith

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.
Uhlen avatar Feb 12 '2011 21:02 Uhlen

como dice MSDN :

NewID() Crea un valor único de tipo identificador único.

y su tabla se ordenará según estos valores aleatorios.

Saeed Amiri avatar Feb 12 '2011 18:02 Saeed Amiri