Я хочу получить 1000 записей из таблицы случайным образом, поэтому я использую:
SELECT top 1000
mycol1
, mycol2
, ROW_NUMBER() OVER (ORDER BY NEWID()) rn
FROM mytable
Однако я не хочу видеть rn
в моем наборе результатов, поэтому я делаю:
SELECT mycol1
, mycol2
FROM (
SELECT top 1000
mycol1
, mycol2
, ROW_NUMBER() OVER (ORDER BY NEWID()) rn
FROM mytable
) a
Когда я это делаю, результаты больше не появляются случайно. Они приходят, как будто я только что сказал топ 10000 без рандомизации с использованием row_number ().
Когда я меняю запрос на
SELECT mycol1
, mycol2
, rn
FROM (
SELECT top 1000
mycol1
, mycol2
, ROW_NUMBER() OVER (ORDER BY NEWID()) rn
FROM mytable
) a
они снова случайны.
Я полагаю, что sql server выполняет какую-то оптимизацию, говоря: "Эй, этому парню не нужен столбец rn
, так что просто проигнорируйте его". Но это приводит к неожиданному поведению в этом случае. Есть ли способ избежать этого?
PS: я использую трюк ROW_NUMBER (), потому что mytable имеет 10 млн. строки и
SELECT top 10000 *
FROM mytable
ORDER BY NEWID()
работает вечно, тогда как с ROW_NUMBER () это занимает всего до 30 секунд.