从oracle中选择随机样本时两个查询之间的差异

JC.*_*JC. 2 sql oracle random

这个问题回答了如何从oracle中选择随机样本的问题,这正是我所需要的.但我不明白该解决方案之间的区别

SELECT  *
FROM    (
        SELECT  *
        FROM    mytable
        ORDER BY
                dbms_random.value
        )
WHERE rownum <= 1000
Run Code Online (Sandbox Code Playgroud)

和类似的东西

select * from mytable where rownum<=1000 order by dbms_random.value
Run Code Online (Sandbox Code Playgroud)

当我使用第一种方法查询时,它需要很长时间(仍然没有完成)但是当我使用第二种方法查询时,它非常快,但结果似乎不是随机的.

感谢和建议/方向,你们都可以提供.

谢谢!

JC

Ada*_*ter 7

在进行任何排序之前, Oracle会根据条件选择行.因此,您的第二个查询可以读作:

  1. 从中选择前1000行 mytable
  2. 按随机值对这1000行进行排序

因此,您将始终以随机顺序获得相同的1000行.第一个查询强制Oracle 首先随机对所有行进行排序:

  1. 按随机值对所有行进行排序
  2. 选择这些随机排序的行的前1000个