Finns det ett kortfattat sätt att hämta en slumpmässig post från en sql-servertabell?
Ja
SELECT TOP 1 * FROM table ORDER BY NEWID()
Förklaring
En NEWID()
genereras för varje rad och tabellen sorteras sedan efter den. Den första posten returneras (dvs posten med "lägst" GUID).
Anteckningar
-
GUID genereras som pseudoslumptal sedan version fyra:
Version 4 UUID är avsedd för att generera UUID från verkligt slumpmässiga eller pseudo-slumpmässiga nummer.
Algoritmen är som följer:
- Sätt de två mest signifikanta bitarna (bitarna 6 och 7) av theclock_seq_hi_and_reserved till noll respektive ett.
- Ställ in de fyra mest signifikanta bitarna (bitarna 12 till 15) i fältet time_hi_and_version till 4-bitars versionsnumret från avsnitt 4.1.3.
- Ställ in alla andra bitar till slumpmässigt (eller pseudo-slumpmässigt) valda värden.
—A Universally Unique IDentifier (UUID) URN-namnområde - RFC 4122
-
Alternativet
SELECT TOP 1 * FROM table ORDER BY RAND()
kommer inte att fungera som man skulle kunna tro.RAND()
returnerar ett enda värde per fråga, så alla rader kommer att dela samma värde. -
Även om GUID-värden är pseudo-slumpmässiga, behöver du en bättre PRNG för de mer krävande applikationerna.
-
Typisk prestanda är mindre än 10 sekunder för cirka 1 000 000 rader - naturligtvis beroende på systemet. Observera att det är omöjligt att träffa ett index, därför kommer prestandan att vara relativt begränsad.