问题:我需要编写存储过程,它将返回一行行的结果集和总行数。
解决方案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一起工作。