Er der en kortfattet måde at hente en tilfældig post fra en sql-servertabel?
Ja
SELECT TOP 1 * FROM table ORDER BY NEWID()
Forklaring
En NEWID()
genereres for hver række, og tabellen sorteres derefter efter den. Den første post returneres (dvs. posten med den "laveste" GUID).
Bemærkninger
-
GUID'er er genereret som pseudo-tilfældige tal siden version fire:
Version 4 UUID er beregnet til at generere UUID'er fra virkelig tilfældige eller pseudo-tilfældige tal.
Algoritmen er som følger:
- Indstil de to mest signifikante bits (bit 6 og 7) af theclock_seq_hi_and_reserved til henholdsvis nul og én.
- Indstil de fire mest signifikante bits (bit 12 til 15) i feltet time_hi_and_version til 4-bit versionsnummeret fra afsnit 4.1.3.
- Indstil alle de andre bits til tilfældigt (eller pseudo-tilfældigt) valgte værdier.
—A Universally Unique IDentifier (UUID) URN-navneområde - RFC 4122
-
Alternativet
SELECT TOP 1 * FROM table ORDER BY RAND()
vil ikke fungere som man skulle tro.RAND()
returnerer én enkelt værdi pr. forespørgsel, så alle rækker deler den samme værdi. -
Selvom GUID-værdier er pseudo-tilfældige, har du brug for en bedre PRNG til de mere krævende applikationer.
-
Typisk ydeevne er mindre end 10 sekunder for omkring 1.000.000 rækker - selvfølgelig afhængigt af systemet. Bemærk, at det er umuligt at ramme et indeks, så ydeevnen vil være relativt begrænset.