问题:我需要编写将返回单页行的结果集和总行数的存储过程。
解决方案 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:我通过将相同的TotalRows
数字添加到结果集中的每一行,将所有内容放在一个存储过程中。这个解决方案感觉很老套,但成本为 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 和带有 VS2010 SP1 和 Entity Framework 4.4 的最新 ODP.NET。我需要最终解决方案才能在 EF 4.4 中工作。我确信一般来说可能有更好的分页方法,但我需要它们与 EF 一起工作。