Czy istnieje zwięzły sposób na pobranie losowego rekordu z tabeli serwera sql?
Tak
SELECT TOP 1 * FROM table ORDER BY NEWID()
Wyjaśnienie
NEWID()
jest generowany dla każdego wiersza, a tabela jest następnie według niego sortowana. Zwracany jest pierwszy rekord (tj. rekord z „najniższym” identyfikatorem GUID).
Notatki
-
Identyfikatory GUID są generowane jako liczby pseudolosowe od wersji czwartej:
UUID w wersji 4 jest przeznaczony do generowania identyfikatorów UUID z liczb prawdziwie losowych lub pseudolosowych.
Algorytm wygląda następująco:
- Ustaw dwa najbardziej znaczące bity (bity 6 i 7) zegara_seq_hi_and_reserved odpowiednio na zero i jeden.
- Ustaw cztery najbardziej znaczące bity (bity od 12 do 15) pola time_hi_and_version na 4-bitowy numer wersji z rozdziału 4.1.3.
- Ustaw wszystkie pozostałe bity na losowo (lub pseudolosowo) wybrane wartości.
— Przestrzeń nazw URN Universally Unique IDentifier (UUID) — RFC 4122
-
Alternatywa
SELECT TOP 1 * FROM table ORDER BY RAND()
nie będzie działać tak, jak mogłoby się wydawać.RAND()
zwraca jedną wartość na zapytanie, dzięki czemu wszystkie wiersze będą miały tę samą wartość. -
Chociaż wartości GUID są pseudolosowe, będziesz potrzebować lepszego PRNG dla bardziej wymagających aplikacji.
-
Typowa wydajność to mniej niż 10 sekund dla około 1 000 000 wierszy — oczywiście w zależności od systemu. Pamiętaj, że niemożliwe jest trafienie w indeks, dlatego wydajność będzie stosunkowo ograniczona.