sql – 如何从包含百万条记录的数据库中选择第一个“N”条记录?

我有一个填充了百万条记录的oracle数据库.我正在尝试编写一个SQL查询,该查询根据特定条件从数据库返回第一个“N”个排序记录(比如100个记录).
SELECT * 
FROM myTable 
Where SIZE > 2000 
ORDER BY NAME DESC

然后以编程方式选择前N个记录.

这种方法的问题是:

>查询结果为五十万
记录和“按名称排序”的原因
所有要在NAME上按降序排序的记录.这种分类花费了大量时间. (将近30-40秒.如果我省略ORDER BY,则只需1秒钟).
>在我感兴趣的那种之后
只有前N(100)条记录.因此,完整记录的排序无用.

我的问题是:

>是否可以指定’N’
查询本身? (这样sort只适用于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个随机行,然后对它们进行排序.

相关文章

(一)日志传送架构 (1.1)相关服务器 主服务器 :用于生产的服务器,上面运行这生产SQL Server数据库...
(一)事故背景 最近在SQL Server 2012生产数据库上配置完事物复制(发布订阅)后,生产数据库业务出现了...
(一)测试目的 目前公司使用的SQL SERVER 2012高可用环境为主备模式,其中主库可执行读写操作,备库既...
(一)背景个人在使用sql server时,用到了sql server的发布订阅来做主从同步,类似MySQL的异步复制。在...
UNION和OR谓词 找出 product 和 product2 中售价高于 500 的商品的基本信息. select * from product wh...
datawhale组队学习task03