Мы используем следующую технику нумерации страниц:
- получить
count(*)
данного фильтра
- получить первые 25 записей данного фильтра
-> отобразить несколько страниц разбиения на страницы
Это работает довольно хорошо, пока count(*)
достаточно быстрый. В нашем случае размер данных вырос до такой степени, что неиндексированный запрос (хотя большая часть данных покрывается индексами) занимает больше минуты. Таким образом, на данный момент пользователь ожидает в основном неважное число (фильтр соответствия всех записей, количество страниц). Первые N записей часто готовы довольно быстро.
Поэтому у меня два вопроса:
- Могу ли я ограничить
count(*)
определенным числом
- или можно было бы ограничить его временем? (нет
count()
известно после 20 мс)
Или просто в целом: есть ли несколько простых способов избежать этой проблемы? Мы хотели бы сохранить систему как можно более нетронутой.
База данных: Oracle 10g
Обновление
Есть несколько сценариев
- a) есть индекс -> ни
count(*)
, ни фактический выбор не должны быть проблемой
- б) нет индекса
count(*)
ОГРОМНО, и для его определения требуются годы -> rownum поможет
count(*)
- ноль или очень низкий, здесь поможет ограничение по времени. Или я мог бы просто не делать count(*)
, если результирующий набор уже ниже ограничения страницы.