Is there a succinct way to retrieve a random record from a sql server table?
Yes
SELECT TOP 1 * FROM table ORDER BY NEWID()
Explanation
A NEWID()
is generated for each row and the table is then sorted by it. The first record is returned (i.e. the record with the “lowest” GUID).
Notes
-
GUIDs are generated as pseudo-random numbers since version four:
The version 4 UUID is meant for generating UUIDs from truly-random or
pseudo-random numbers.The algorithm is as follows:
- Set the two most significant bits (bits 6 and 7) of the
clock_seq_hi_and_reserved to zero and one, respectively. - Set the four most significant bits (bits 12 through 15) of the
time_hi_and_version field to the 4-bit version number from
Section 4.1.3. - Set all the other bits to randomly (or pseudo-randomly) chosen
values.
—A Universally Unique IDentifier (UUID) URN Namespace – RFC 4122
- Set the two most significant bits (bits 6 and 7) of the
-
The alternative
SELECT TOP 1 * FROM table ORDER BY RAND()
will not work as one would think.RAND()
returns one single value per query, thus all rows will share the same value. -
While GUID values are pseudo-random, you will need a better PRNG for the more demanding applications.
-
Typical performance is less than 10 seconds for around 1,000,000 rows — of course depending on the system. Note that it’s impossible to hit an index, thus performance will be relatively limited.