【发布时间】:2012-11-24 03:52:11
【问题描述】:
问题:我需要编写将返回单页行的结果集的存储过程和总行数。
解决方案 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 数字添加到结果集中的 每一 行,将所有内容放在一个存储过程中。这个解决方案感觉很hackish,但是成本为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 和 Entity Framework 4.4 的最新 ODP.NET。我需要最终解决方案才能在 EF 4.4 中工作。我确信总体上可能有更好的分页方法,但我需要它们与 EF 一起使用。
【问题讨论】:
-
EF 中的分页与数据库无关。
-
是的,但我只是想明确一点,我不想使用 ODP.NET 或 ADO.NET 特定的代码,而是宁愿停留在高级别的地方。跨度>
-
Tom Kyte 写了一篇关于使用 rownum 限制结果集的文章:oracle.com/technetwork/issue-archive/2006/06-sep/… 它可能会回答您的一些问题。
标签: oracle pagination