Как известно, Postgresql OFFSET требует, чтобы он просматривал все строки до тех пор, пока точка не дошла до того места, где вы просили, что делает его бесполезным для разбивки на страницы с помощью огромных наборов результатов, все медленнее и медленнее, когда OFFSET поднимается вверх.
PG 8.4 теперь поддерживает функции окна. Вместо:
SELECT * FROM table ORDER BY somecol LIMIT 10 OFFSET 500
Вы можете сказать:
SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY somecol ASC) AS rownum FROM table) AS foo
WHERE rownum > 500 AND rownum <= 510
Помогают ли последние помочь нам вообще? Или нам нужно продолжать использовать идентификационные столбцы и временные таблицы для большой разбивки на страницы?