【发布时间】:2010-03-01 10:49:35
【问题描述】:
我想从一个表中随机获取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 个 mio。行和
SELECT top 10000 *
FROM mytable
ORDER BY NEWID()
永远运行,而使用 ROW_NUMBER() 最多只需要 30 秒。
【问题讨论】:
-
喜欢你的“ROW_NUMBER() OVER (ORDER BY NEWID())”。已经用过几次了,效果很好。
标签: sql sql-server-2005 query-optimization