Проблема: мне нужно написать хранимую процедуру (процедуры), которая вернет результирующий набор одной страницы из строк и число полных строк.
Решение 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? Какое из вышеупомянутых решений наиболее часто используется на практике? Кто-нибудь из них считается просто неправильным? Обратите внимание, что моя БД является и останется относительно небольшой (менее 10 ГБ).
Я использую Oracle 11g и последний ODP.NET с VS2010 SP1 и Entity Framework 4.4. Мне нужно окончательное решение для работы в EF 4.4. Я уверен, что есть, вероятно, лучшие методы для разбивки на страницы в целом, но мне нужно, чтобы они работали с EF.