在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 如果您在订单列上有适当的索引,此方法将会更好。在这种情况下,使用两个查询可能会更有效(一个用于总行数,一个用于结果)。 这两种方法都是适用的,但是一般来说,如果您想要同时执行行数和分页集,则使用分析更有效,因为您只会查询行一次。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |