Existe uma maneira sucinta de recuperar um registro aleatório de uma tabela do sql server?
Sim
SELECT TOP 1 * FROM table ORDER BY NEWID()
Explicação
Um
NEWID()
é gerado para cada linha e a tabela é então classificada por ela. O primeiro registro é retornado (ou seja, o registro com o GUID "mais baixo"). Observações
-
GUIDs são gerados como números pseudo-aleatórios desde a versão quatro:
A versão 4 UUID destina-se a gerar UUIDs a partir de números ou pseudo-aleatórios verdadeiramente aleatórios.
O algoritmo é o seguinte:
- Defina os dois bits mais significativos (bits 6 e 7) de theclock_seq_hi_and_reserved como zero e um, respectivamente.
- Defina os quatro bits mais significativos (bits 12 a 15) do campo time_hi_and_version para o número da versão de 4 bits da Seção 4.1.3.
- Defina todos os outros bits para valores escolhidos aleatoriamente (ou pseudo-aleatoriamente).
—Um namespace URN de identificador universalmente exclusivo (UUID) - RFC 4122
-
A alternativaSELECT TOP 1 * FROM table ORDER BY RAND()
não funcionará como se poderia pensar.RAND()
retorna um único valor por consulta, portanto, todas as linhas compartilharão o mesmo valor.
-
Embora os valores GUID sejam pseudo-aleatórios, você precisará de um PRNG melhor para os aplicativos mais exigentes.
-
O desempenho típico é inferior a 10 segundos para cerca de 1.000.000 de linhas - é claro, dependendo do sistema. Observe que é impossível atingir um índice, portanto, o desempenho será relativamente limitado.