Эта ссылка имеет интересное сравнение между Orderby (NEWID ()) и другими методами для таблиц с 1, 7 и 13 миллионами строк.
Часто, когда в дискуссионных группах задаются вопросы о том, как выбрать случайные строки, предлагается запрос NEWID; это просто и работает очень хорошо для небольших столов.
SELECT TOP 10 PERCENT *
FROM Table1
ORDER BY NEWID()
Однако запрос NEWID имеет большой недостаток, когда вы используете его для больших таблиц. Предложение ORDER BY приводит к копированию всех строк в таблице в базу данных tempdb, где они сортируются. Это вызывает две проблемы:
- Операция сортировки обычно связана с высокой стоимостью.
Сортировка может использовать большое количество дисковых операций ввода-вывода и может выполняться в течение длительного времени.
- В худшем случае для базы данных tempdb может не хватить места. в
в лучшем случае, tempdb может занимать большой объем дискового пространства
это никогда не будет исправлено без команды ручного сжатия.
Вам нужен способ случайного выбора строк, который не будет использовать базу данных tempdb и не станет намного медленнее по мере увеличения таблицы. Вот новая идея о том, как это сделать:
SELECT * FROM Table1
WHERE (ABS(CAST(
(BINARY_CHECKSUM(*) *
RAND()) as int)) % 100) < 10
Основная идея этого запроса заключается в том, что мы хотим сгенерировать случайное число от 0 до 99 для каждой строки в таблице, а затем выбрать все те строки, случайное число которых меньше значения указанного процента. В этом примере мы хотим, чтобы приблизительно 10 процентов строк были выбраны случайным образом; поэтому мы выбираем все строки, чье случайное число меньше 10.
Пожалуйста, прочитайте статью полностью в MSDN .