Има ли кратък начин за извличане на произволен запис от таблица на sql сървър?
Да
SELECT TOP 1 * FROM table ORDER BY NEWID()
Обяснение
A NEWID()
се генерира за всеки ред и след това таблицата се сортира по него. Първият запис се връща (т.е. записът с "най-ниския" GUID).
Бележки
-
GUID се генерират като псевдослучайни числа от версия четвърта:
UUID версия 4 е предназначена за генериране на UUID от наистина произволни или псевдослучайни числа.
Алгоритъмът е следният:
- Задайте двата най-значими бита (битове 6 и 7) от theclock_seq_hi_and_reserved съответно на нула и единица.
- Задайте четирите най-значими бита (битове от 12 до 15) на полето time_hi_and_version на 4-битовия номер на версията от раздел 4.1.3.
- Задайте всички останали битове на произволно (или псевдослучайно) избрани стойности.
—Пространство от имена на URN с универсален уникален идентификатор (UUID) – RFC 4122
-
Алтернативният
SELECT TOP 1 * FROM table ORDER BY RAND()
няма да работи, както човек би си помислил.RAND()
връща една единствена стойност на заявка, като по този начин всички редове ще споделят една и съща стойност. -
Въпреки че стойностите на GUID са псевдослучайни, ще ви трябва по-добър PRNG за по-взискателните приложения.
-
Типичната производителност е по-малко от 10 секунди за около 1 000 000 реда - разбира се в зависимост от системата. Имайте предвид, че е невъзможно да се удари индекс, така че производителността ще бъде относително ограничена.