gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:49:38 26 4
gpt4 key购买 nike

我有一个装有数百万条记录的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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com