sql - 如何从包含百万个记录的数据库中选择第一个 'N'记录?

标签 sql oracle sorting sql-order-by

我有一个装有数百万条记录的oracle数据库。我正在尝试编写一个SQL查询,该查询将根据特定条件从数据库返回前一个'N'排序记录(例如100条记录)。

SELECT * 
FROM myTable 
Where SIZE > 2000 
ORDER BY NAME DESC

然后以编程方式选择前N条记录。

这种方法的问题是:
  • 查询结果变成五百万
    记录和“按名称订购”原因
    所有记录将按降序在NAME上排序。这种分类要花费很多时间。 (将近30-40秒。如果我省略ORDER BY,则只需1秒)。
  • 我感兴趣的排序之后
    仅前N(100)条记录。因此,对完整记录进行排序是没有用的。

  • 我的问题是:
  • 是否可以在其中指定'N'
    查询本身? (这样排序仅适用于N条记录,查询变得更快)。
  • SQL中改善查询排序的任何更好方法
    仅N个元素并快速返回
    时间。
  • 最佳答案

    如果您的目的是找到100个随机行,然后对它们进行排序,则Lasse's solution是正确的。如果按照我的想法,如果您希望前100行按名称排序,而舍弃其他行,则可以构建如下查询:

    SELECT * 
      FROM (SELECT * 
              FROM myTable 
             WHERE SIZE > 2000 ORDER BY NAME DESC) 
     WHERE ROWNUM <= 100
    

    优化程序将了解这是一个TOP-N查询,并将能够使用NAME上的索引。它不必对整个结果集进行排序,它只会从索引的末尾开始并向后读取,并在100行之后停止。

    您还可以在原始查询中添加提示,以使优化器了解您仅对前几行感兴趣。这可能会生成类似的访问路径:
    SELECT /*+ FIRST_ROWS*/* FROM myTable WHERE SIZE > 2000 ORDER BY NAME DESC
    

    编辑:仅在查询中添加AND rownum <= 100是行不通的,因为在Oracle rownum中,在排序之前将归因于:这就是为什么必须使用子查询的原因。没有子查询,Oracle将选择100个随机行,然后对其进行排序。

    关于sql - 如何从包含百万个记录的数据库中选择第一个 'N'记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1410048/

    相关文章:

    sql - Excel VBA SQL 查询以 Access 以返回日期之间的记录

    c# - 探测 privatePath 不工作

    python - 在python中按值对defaultdict进行排序

    java - 如果排序字段为 "",lucene 如何使用比较器处理排序字段

    java - 自定义排序与插入排序

    mysql - 如何制作一个sql语句在distinct之前执行order by?

    SQL - 来自同一子查询的多个 where in 子句?

    oracle - 如何部署Oracle数据库?

    c# - SQL 参数集合

    java - 在 Oracle PL/SQL 中使用 xmltype 从 XML 生成 XSD 文件