Как сказал Jiri Tousek, каждый запрошенный вами запрос должен знать, какие предыдущие запросы были возвращены.
Вместо того, чтобы вставлять идентификаторы ранее возвращенных строк в таблицу, а затем проверять, что новый результат еще не находится в этой таблице, я бы просто добавил столбец в таблицу со случайным числом, которое определяло бы новый случайный порядок строк.
Вы заполняете эту колонку случайными числами один раз.
Это будет помнить случайный порядок строк и сделать его стабильным, поэтому все, что вам нужно запомнить между запросами, - это количество случайных строк, которые вы запросили до сих пор. Затем просто выберите столько строк, сколько необходимо, начиная с того места, где вы остановились в предыдущем запросе.
Добавить колонку RandomNumber binary(8)
на стол. Вы можете выбрать другой размер. Должно быть достаточно 8 байтов.
Заполните его случайными числами. Однажды.
UPDATE tablename
SET RandomNumber = CRYPT_GEN_RANDOM(8)
Создание индекса на RandomNumber
колонке. Уникальный индекс. Если окажется, что повторяются случайные числа (что маловероятно для 20 000 строк и случайных чисел длиной 8 байтов), затем повторно создавайте случайные числа (запустите оператор UPDATE
еще раз), пока все они не станут уникальными.
Запрос первые 10 случайных строки:
SELECT TOP(10) *
FROM tablename
ORDER BY RandomNumber
Как перерабатывает/использовать эти 10 случайных строки запоминают последнее используемое случайное число. Лучший способ сделать это зависит от того, как вы обрабатываете эти 10 случайных строк.
DECLARE @VarLastRandomNumber binary(8);
SET @VarLastRandomNumber = ...
-- the random number from the last row returned by the previous query
Запрос следующие 10 случайных строк:
SELECT TOP(10) *
FROM tablename
WHERE RandomNumber > @VarLastRandomNumber
ORDER BY RandomNumber
процесса их и помнить последний использовавшийся случайное число.
Повторите. В качестве бонуса вы можете запросить различное количество случайных строк на каждой итерации (она не должна быть 10 каждый раз).
Показать выборочные данные пожалуйста. – NEER