Разбивка на большие наборы данных?- Счетчик прерываний (*) через определенное время - PullRequest
2 голосов
/ 30 ноября 2010

Мы используем следующую технику нумерации страниц:

  • получить count(*) данного фильтра
  • получить первые 25 записей данного фильтра

-> отобразить несколько страниц разбиения на страницы

Это работает довольно хорошо, пока count(*) достаточно быстрый. В нашем случае размер данных вырос до такой степени, что неиндексированный запрос (хотя большая часть данных покрывается индексами) занимает больше минуты. Таким образом, на данный момент пользователь ожидает в основном неважное число (фильтр соответствия всех записей, количество страниц). Первые N записей часто готовы довольно быстро.

Поэтому у меня два вопроса:

  • Могу ли я ограничить count(*) определенным числом
  • или можно было бы ограничить его временем? (нет count() известно после 20 мс)

Или просто в целом: есть ли несколько простых способов избежать этой проблемы? Мы хотели бы сохранить систему как можно более нетронутой.

База данных: Oracle 10g

Обновление

Есть несколько сценариев

  • a) есть индекс -> ни count(*), ни фактический выбор не должны быть проблемой
  • б) нет индекса
    • count(*) ОГРОМНО, и для его определения требуются годы -> rownum поможет
    • count(*) - ноль или очень низкий, здесь поможет ограничение по времени. Или я мог бы просто не делать count(*), если результирующий набор уже ниже ограничения страницы.

1 Ответ

3 голосов
/ 30 ноября 2010

Вы можете использовать 'где rownum

...