This question回答了如何从oracle中随机选择样本的问题,这正是我所需要的。然而,我不明白这种解决方案之间的区别
SELECT *
FROM (
SELECT *
FROM mytable
ORDER BY
dbms_random.value
)
WHERE rownum <= 1000像这样的东西
select * from mytable where rownum<=1000 order by dbms_random.value当我使用第一种方法查询时,它需要很长时间(仍然没有完成),但当我使用第二种方法查询时,它非常快,但结果似乎不是随机的。
感谢你们能提供的建议和方向。
谢谢!
JC
发布于 2009-07-21 14:52:24
在任何排序发生之前,Oracle根据条件选择行。因此,您的第二个查询可以理解为:
从这1000行中选择前1000行
因此,您将始终以随机顺序获得相同的1000行。第一个查询强制Oracle首先对所有行进行随机排序:
发布于 2009-07-21 14:51:23
在Oracle中,ORDER BY在ROWNUM之后求值。
此查询:
SELECT id, ROWNUM
FROM (
SELECT NULL AS id
FROM dual
UNION ALL
SELECT 1 AS id
FROM dual
)
ORDER BY
id将检索以下内容:
id rownum
---- ------
1 2
NULL 1您的第一个查询首先对值进行随机排序,然后选择前1000条记录,这需要很长时间。
第二个查询首先选择1000记录,然后按随机顺序对它们进行排序,这当然更快,但结果不是随机的。
发布于 2009-07-21 14:59:01
一种更快的替代方案:
从emp样本中选择*(10);
或
从emp SAMPLE(5)块中选择*;
点击此处阅读:http://oracleact.com/papers/sampleclause.html
EDIT1:重读之后,这一点已经被提到(或多或少)。但是,我不能删除此答案。
https://stackoverflow.com/questions/1159661
复制相似问题