Is er een beknopte manier om een willekeurig record uit een SQL-servertabel op te halen?
Ja
SELECT TOP 1 * FROM table ORDER BY NEWID()
Uitleg
Een NEWID()
wordt gegenereerd voor elke rij en de tabel wordt er vervolgens op gesorteerd. Het eerste record wordt geretourneerd (d.w.z. het record met de "laagste" GUID).
Opmerkingen
-
GUID's worden gegenereerd als pseudo-willekeurige getallen sinds versie vier:
De versie 4 UUID is bedoeld voor het genereren van UUID's van echt-willekeurige ofpseudo-willekeurige getallen.
Het algoritme is als volgt:
- Stel de twee meest significante bits (bits 6 en 7) van theclock_seq_hi_and_reserved in op respectievelijk nul en één.
- Stel de vier meest significante bits (bits 12 tot en met 15) van het veld time_hi_and_version in op het 4-bits versienummer uit paragraaf 4.1.3.
- Stel alle andere bits in op willekeurig (of pseudo-willekeurig) gekozen waarden.
—Een universeel unieke IDentifier (UUID) URN-naamruimte - RFC 4122
-
Het alternatief
SELECT TOP 1 * FROM table ORDER BY RAND()
zal niet werken zoals men zou denken.RAND()
retourneert één enkele waarde per zoekopdracht, dus alle rijen zullen dezelfde waarde delen. -
Hoewel GUID-waarden pseudo-willekeurig zijn, hebt u een betere PRNG nodig voor de meer veeleisende toepassingen.
-
Typische prestaties zijn minder dan 10 seconden voor ongeveer 1.000.000 rijen - natuurlijk afhankelijk van het systeem. Merk op dat het onmogelijk is om een index te raken, dus de prestaties zullen relatief beperkt zijn.