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

Sql 从oracle中选择随机样本时两个查询之间的差异,sql,oracle,random,Sql,Oracle,Random,回答了如何从oracle中选择随机样本的问题,这正是我所需要的。然而,我不理解这两种解决方案之间的区别 SELECT * FROM ( SELECT * FROM mytable ORDER BY dbms_random.value ) WHERE rownum <= 1000 什么的 select * from mytable where rownum<=1000 or

回答了如何从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

在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条记录,然后按随机顺序对它们进行排序,这当然更快,但结果不是随机的。

Oracle在进行任何排序之前都会根据条件选择行。因此,您的第二个查询可以理解为:

从mytable中选择前1000行 按随机值对这1000行进行排序 因此,您将始终以随机顺序获得相同的1000行。第一个查询强制Oracle首先对所有行进行随机排序:

按随机值对所有行进行排序 从这些随机排列的行中选择前1000行
第二个将返回1000条记录并随机排序。在第一个查询中,它花费了更多的时间,因为它对所有记录进行排序,然后提取1000个随机结束于前1000个位置的记录

我担心,不管是否缓慢,您都需要类似于第一个查询的内容。

更快的选择:

从emp样本10中选择*

从emp SAMPLE5块中选择*

请看这里:


编辑1:重读之后,这已经或多或少提到了。但是我不能删除这个答案

我认为在这里有这个答案是值得的,以防有人读到这个问题,只是复制查询而没有进一步查看。