我有一个装有数百万条记录的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个元素并快速返回
时间。
最佳答案
如果您的目的是找到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/