Нумерация быстро меняющегося содержимого базы данных - PullRequest
4 голосов
/ 22 февраля 2012

Мне нужно прочитать содержимое таблицы базы данных MS SQL, используя нумерацию страниц, то есть выборку первой страницы из N строк, затем второй страницы из N строк и т. Д.

Если содержимое базы данныхзначительно изменяется во время нумерации страниц, простой запрос нумерации страниц, такой как:

SELECT *
FROM (SELECT a.*,
    ROW_NUMBER() OVER (ORDER BY id) AS rnum
    FROM articles a)
WHERE rnum <= 10
AND   rnum >= 6;

, может работать ненадежно.Вставленные строки могут быть пропущены или могут вызвать повторение последующих строк, а удаленные строки могут привести к пропуску последующих строк.

Я мог бы избежать таких проблем, выполнив любое из следующих действий:

  1. Блокировка строк от обновления во время всей нумерации страниц - слишком ограничительный
  2. Копирование строк во временную таблицу перед разбиением на страницы - слишком медленный
  3. Выбратьпо комбинации номера строки и отсортированного значения, которое отображалось в конце предыдущей страницы, возобновляется в соответствующем месте на основе изменяющейся таблицы, но все еще получает только следующие N строк

Iвроде как 3-е решение, но мне трудно реализовать, когда в столбцах сортировки есть повторяющиеся значения.

Например, предположим, у меня есть список статей, отсортированных по убыванию рейтинга.Если рейтинг одинаковый, они сортируются по возрастанию идентификатора (идентификаторы уникальны):

ID      RATING
9       34
3       32
6       32
8       32
12      32
1       25
2       23

Теперь я хочу страницы из 3 статей, что означает, что на первой странице будут статьи 9, 3 и6. Это делается путем запроса трех лучших статей из отсортированного списка.

Теперь я хочу взять следующие 3 статьи, начиная со статьи 8, используя идентификатор статьи в качестве маркера для того, где возобновить.

Если бы я сказал базе данных взять репутацию статьи 8, а затем взять 3 статьи, репутация которых ниже этой, я пропустил бы статью 12.

Если бы я сказал базе данных взять репутациюстатьи 8 и, если взять 3 статьи, репутация которых ниже или равна этому, я бы повторил статьи 3 и 6.

Какой SQL-запрос (или комбинацию запросов) можно использовать для возобновления нумерации страницстатья 8, с использованием идентификатора статьи в качестве маркера для возобновления?

1 Ответ

3 голосов
/ 22 февраля 2012

Преобразование комментария в ответ, поскольку кажется, что он решил вопрос пользователя.

Так что кажется, что вы должны кешировать результат для этого пользователя (например, можете ли вы отправить все идентификаторы в приложение и просто получать по 3 статьи за раз при каждом извлечении), но также добавить заявление об отказе от ответственности, если оно потребует их полчаса, чтобы пролистать список, список, возможно, больше не является точным.

...