问题:我需要编写存储过程,返回单个页面的行的结果集 和 总行数。
解决方案A:我创建了两个存储过程,一个返回单个页面的结果集,另一个返回标量--总行数。Explain Plan 显示第一个存储过程的成本为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:我把所有东西都放在一个存储过程中,通过将相同的TotalRows
数添加到结果集中的每一行中。这种解决方案感觉很hackish,但只需要一个成本为9的存储过程,所以我倾向于使用这个解决方案。
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和最新的ODP.NET与VS2010 SP1和Entity Framework 4.4。 我需要最终的解决方案能够与EF 4.4一起工作。 我相信总体上可能有更好的分页方法,但我需要它们与EF一起工作。