微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Oracle中分页的最佳做法?

问题:我需要编写存储过程,它将返回一行行的结果集和总行数。

解决方案A:我创建两个存储过程,一个返回单个页面的结果集,另一个返回一个标量 – 总行数。解释计划说,第一个sproc的成本为9,第二个成本为3。

SELECT  *
FROM    ( SELECT ROW_NUMBER() OVER ( ORDER BY D.ID DESC ) AS RowNum,...
        ) AS PageResult
WHERE   RowNum >= @from
    AND RowNum < @to
ORDER BY RowNum

SELECT  COUNT(*)
FROM    ...

解决方案B:将所有内容都放在一个sproc中,通过在结果集中的每一行添加相同的TotalRows数字。这个解决方案感到骇人听闻,但是花费9,只有一个sproc,所以我倾向于使用这个解决方案。

SELECT * 
FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY D.ID DESC  ) RowNum,COUNT(*) OVER () TotalRows,WHERE RowNum >= from
        AND RowNum < to
ORDER BY RowNum;

Oracle中有分页的最佳做法吗?上述哪种解决方案在实践中最常用?他们中的任何一个被认为是错误的吗?请注意,我的数据库将保持较小(小于10GB)。

我正在使用Oracle 11g和最新的带有VS2010 SP1和实体框架4.4的ODP.NET。我需要最终解决方案在EF 4.4内工作。我确定一般可能有更好的方法进行分页,但我需要他们与EF一起工作。

如果您已经在使用分析(ROW_NUMBER()OVER …),则在同一分区上添加一个分析函数将为查询添加可忽略的成本。

另一方面,还有很多其他的分页方式,其中一个使用rownum:

SELECT * 
  FROM (SELECT *,rownum rn
          FROM (SELECT *
                  FROM your_table
                 ORDER BY col)
         WHERE rownum <= :Y)
 WHERE rn >= :X

如果您在订单列上有适当的索引,此方法将会更好。在这种情况下,使用两个查询可能会更有效(一个用于总行数,一个用于结果)。

这两种方法都是适用的,但是一般来说,如果您想要同时执行行数和分页集,则使用分析更有效,因为您只会查询行一次。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐