Хорошо,
Я много читал о возврате случайного набора строк в прошлом году, и решение, которое мы придумали, было
ORDER BY newid()
Это хорошо для <5k строк. Но когда мы получаем> 10-20 тыс. Строк, мы получаем тайм-ауты SQL, запланированное выполнение говорит мне, что 76% моей стоимости запроса приходится на эту строку. и удаление этой линии увеличивает скорость на порядок при большом количестве строк.
Наши пользователи должны выполнять до 100 тыс. Строк одновременно, как это.
Чтобы дать вам немного больше подробностей.
У нас есть таблица с 2,6 миллионами 4-значных буквенно-цифровых кодов. Мы используем случайный набор из них, чтобы получить доступ к месту проведения. Например, если у нас есть событие с вместимостью 5000, случайный набор из 5000 будет извлечен из таблицы, а затем выдан каждому клиенту в виде штрих-кода, а затем приложение сканирования штрих-кода у двери с тот же список из 5000. Причина использования 4-значного буквенно-цифрового кода (а не тупо длинного числа, такого как GUID) состоит в том, что людям легко записать номер (или отправить его другу) и просто принести номер и введите его вручную, поэтому мы не хотим большого количества символов. Клиенты любят последний бит между прочим.
Есть ли лучший способ, чем ORDER BY newid()
, или есть более быстрый способ получить 100 000 случайных строк из таблицы с 2,6 мил?
О, и мы используем MS SQL 2005.
Спасибо
Jo