Выбор интервалов записей
В PostgreSQL количество записей, выбираемых запросом SQL, не ограничивается. Обработка запроса, возвращающего несколько миллионов записей, займет много времени, но сервер не остановится, пока не вернет весь итоговый набор (или процесс не будет прерван извне).
Вероятно, выделение некоторой части выборки легко реализуется на программном уровне, но в SQL предусмотрены ключевые слова LIMIT и OFFSET, упрощающие выборку заданной части итогового набора.
Секция LIMIT ограничивает максимальное количество записей в итоговом наборе (хотя размер итогового набора вполне может быть меньше заданной величины). При наличии секции OFFSET в итоговом наборе пропускается количество записей, заданное параметром секции. Если заданы оба ключевых слова, то отсчет ограничения, указанного в секции LIMIT, начинается после пропуска записей в соответствии с секцией OFFSET.
Как показано в листинге 4.45, первый запрос, содержащий простую секцию LIMIT, ограничивается выборкой первых пяти записей из результатов объединения таблиц editions и books. Обычно это объединение содержит 17 записей.
Листинг 4.45. Использование секций LIMIT и OFFSET.
booktown=# SELECT isbn, title, publication booktown-# FROM editions NATURAL JOIN books AS b (book_id) booktown-# ORDER BY publication DESC booktown-# LIMIT 5; isbn | title | publication 0596000855 | Programming Python | 2001-03-01 0451457994 | 2001: A Space Odyssey | 2000-09-12 0451198492 | 2001: A Space Odyssey | 1999-10-01 044100590X | Dune | 1999-10-01 0929605942 | The Tell-Tale Heart | 1998-12-01 (5 rows) booktown=# SELECT isbn, title, publication booktown-# FROM editions NATURAL JOIN books AS b (book_id) booktown-# ORDER BY publication DESC booktown-# LIMIT 5 booktown-# OFFSET 2; isbn | title | publication 0451198492 | 2001: A Space Odyssey | 1999-10-01 044100590X | Dune | 1999-10-01 0929605942 | The Tell-Tale Heart | 1998-12-01 0441172717 | Dune | 1998-09-01 1885418035 | The Tell-Tale Heart | 1995-03-28 (5 rows)
Второй запрос в листинге 4.45 содержит секцию OFFSET, вследствие чего начало отсчета смещается на две записи вниз. Последние три записи в итоговом наборе первого запроса совпадают с первыми тремя записями итогового набора второго запроса. Секция ORDER BY обеспечивает единый порядок следования записей в итоговых наборах обоих запросов.