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

时间:2009-07-21 14:46:51

标签: sql oracle random

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

4 个答案:

答案 0 :(得分:7)

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

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

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

答案 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。

我担心,无论你是慢慢还是不需要,都需要像第一次查询一样。