【问题标题】:Difference between two queries when selecting a random sample from oracle从 oracle 中选择随机样本时两个查询之间的差异
【发布时间】:2010-11-12 16:17:59
【问题描述】:

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

【问题讨论】:

    标签: sql oracle random


    【解决方案1】:

    更快的选择:

    SELECT * FROM emp SAMPLE(10);

    SELECT * FROM emp SAMPLE(5) BLOCKS;

    在这里阅读:http://oracleact.com/papers/sampleclause.html

    EDIT1:重读后,这已经被提及(或多或少)。但是我不能删除这个答案。

    【讨论】:

    • 我认为值得在这里给出这个答案,以防有人阅读了这个问题并且只是复制了查询而不进一步查看。
    【解决方案2】:

    第二个将返回 1000 条记录并随机排序。在第一个查询中,它需要更多时间,因为它对所有记录进行排序,然后提取 1000 个随机结束于前 1000 个位置的 thouse。

    恐怕你需要像第一个查询这样的东西。

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

        Oracle 中,ORDER BYROWNUM 之后计算。

        这个查询:

        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记录,然后随机排序,当然速度更快,但结果不是随机的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-12-27
          • 2011-08-07
          • 2010-10-18
          • 1970-01-01
          • 2014-01-12
          • 1970-01-01
          • 2023-04-01
          • 1970-01-01
          相关资源
          最近更新 更多