Существуют два способа разбиения на страницы в базе данных (я предполагаю, что вы используете SQL Server):
Использование OFFSET
Другие объяснили, как функция ранжирования ROW_NUMBER() OVER()
может использоваться для выполнения страниц. Стоит отметить, что SQL Server 2012 наконец-то включил поддержку стандарта SQL OFFSET .. FETCH
предложение:
SELECT first_name, last_name, score
FROM players
ORDER BY score DESC
OFFSET 40 ROWS FETCH NEXT 10 ROWS ONLY
Если вы используете SQL Server 2012 и обратная совместимость не является проблемой, вам, вероятно, следует предпочесть это предложение, поскольку оно будет выполняться SQL Server более оптимально в угловых случаях.
Использование метода SEEK
Существует совершенно другой, гораздо более быстрый, но менее известный способ выполнения подкачки в SQL. Это часто называют «методом поиска», как описано в этом посте здесь .
SELECT TOP 10 first_name, last_name, score
FROM players
WHERE (score < @previousScore)
OR (score = @previousScore AND player_id < @previousPlayerId)
ORDER BY score DESC, player_id DESC
Значения @previousScore
и @previousPlayerId
являются соответствующими значениями последней записи с предыдущей страницы. Это позволяет вам получить «следующую» страницу. Если направление ORDER BY
равно ASC
, просто используйте вместо него >
.
С помощью описанного выше метода вы не можете сразу перейти к странице 4, не предварительно загрузив предыдущие 40 записей. Но часто, вы все равно не хотите прыгать так далеко. Вместо этого вы получаете гораздо более быстрый запрос, который может извлекать данные в постоянное время, в зависимости от вашей индексации. Кроме того, ваши страницы остаются «стабильными», независимо от того, изменяются ли базовые данные (например, на странице 1, пока вы находитесь на странице 4).
Это лучший способ реализовать подкачку, например, при отложенной загрузке большего количества данных в веб-приложения.
Обратите внимание, что "метод поиска" также называется подкачки с клавиатуры .