問題: 行の 1 ページと合計行数の結果セットを返すストアド プロシージャを作成する必要があります。
解決策 A: 2 つのストアド プロシージャを作成します。1 つは単一ページの結果セットを返し、もう 1 つはスカラー (合計行) を返します。Explain Plan によると、最初の sproc のコストは 9 で、2 番目の sproc のコストは 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
の行に同じ番号を追加して、すべてを 1 つの sproc に入れます。このソリューションはハックのように感じますが、コストが 9 で sproc が 1 つしかないため、このソリューションを使用する傾向があります。
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 でのページネーションのベスト プラクティスはありますか? 前述のソリューションのうち、実際に最も使用されているのはどれですか? それらのいずれかが単に間違っていると見なされますか? 私のDBは比較的小さい(10GB未満)ままであることに注意してください。
Oracle 11g と最新の ODP.NET を VS2010 SP1 と Entity Framework 4.4 で使用しています。EF 4.4 内で動作する最終的なソリューションが必要です。一般的にページネーションにはおそらくより良い方法があると思いますが、EFで動作する必要があります。