not new generate generar español sql-server newid

sql server - generate - "Order by newid()"-¿Cómo funciona?



sql server newid() is not unique (5)

Sé que si ejecuto esta consulta

select top 100 * from mytable order by newid()

obtendrá 100 registros aleatorios de mi mesa.

Sin embargo, estoy un poco confundido sobre cómo funciona, ya que no veo newid() en la lista de select . ¿Alguien puede explicar? ¿Hay algo especial sobre newid() aquí?


Sé lo que hace NewID (), solo trato de entender cómo ayudaría en la selección al azar. Es que (1) la instrucción select seleccionará TODO de mytable, (2) para cada fila seleccionada, vire en un identificador único generado por NewID (), (3) clasifique las filas por este uniqueidentifier y (4) elija la parte superior 100 de la lista ordenada?

Sí. esto es más o menos exactamente correcto (excepto que no necesariamente tiene que 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ómputo agrega la columna NEWID() para cada fila (2506 en la tabla en mi consulta de ejemplo) luego las filas en la tabla se ordenan por esta columna con los 100 mejores seleccionados.

SQL Server no necesita ordenar el conjunto completo de las posiciones 100 abajo, por lo que utiliza un operador de clasificación TOP N que intenta realizar toda la operación de clasificación en la memoria ( para pequeños valores de N )


En general, funciona así:

  • Todas las filas de mytable están " enlazadas "
  • NEWID () se ejecuta para cada fila
  • Las filas se ordenan según el número aleatorio de NEWID ()
  • Se seleccionan 100 primeras filas

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 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 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 no se hará mucho más lenta a medida que la tabla se agranda. Aquí hay una nueva idea sobre cómo hacer eso:

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 en la tabla, y luego elegir todas aquellas filas cuyo número aleatorio sea 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.


como dice MSDN :

NewID () crea un valor único de type uniqueidentifier.

y su tabla será ordenada por estos valores aleatorios.


use select top 100 randid = newid(), * from mytable order by randid le select top 100 randid = newid(), * from mytable order by randid entonces ..