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
答案 0 :(得分:7)
Oracle根据之前的条件选择行进行任何排序。因此,您的第二个查询可以读作:
mytable
因此,您将始终以随机顺序获得相同的1000行。第一个查询强制Oracle首先随机对所有行进行排序:
答案 1 :(得分:1)
在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
个记录,然后按随机顺序对它们进行排序,这当然更快但结果不是随机的。
答案 2 :(得分:1)
更快的替代方案:
SELECT * FROM emp SAMPLE(10);
或
SELECT * FROM emp SAMPLE(5)BLOCKS;
请在此处阅读:http://oracleact.com/papers/sampleclause.html
EDIT1:重读后,已经提到过(或多或少)。但是我不能删除这个答案。
答案 3 :(得分:0)
第二个将返回1000条记录并随机订购。在第一个查询中,它需要更多的时间,因为它正在排序所有记录,然后提取1000个在前1000个位置随机结束的thouse。
我担心,无论你是慢慢还是不需要,都需要像第一次查询一样。