7.6. LIMIT и OFFSET#
7.6. LIMIT и OFFSET #
LIMIT и OFFSET позволяют вам извлекать только
часть строк, которые генерируются остальным запросом:
SELECTselect_listFROMtable_expression[ ORDER BY ... ] [ LIMIT {number| ALL } ] [ OFFSETnumber]
Если указано ограничение на количество строк, будет возвращено не более указанного количества строк (но возможно меньше, если сам запрос возвращает меньше строк). LIMIT ALL эквивалентно опусканию предложения LIMIT, также как и LIMIT с аргументом NULL.
OFFSET говорит о том, чтобы пропустить указанное количество строк перед началом возврата строк. OFFSET 0 эквивалентно опусканию предложения OFFSET, также как и OFFSET с аргументом NULL.
Если указаны и OFFSET и LIMIT, то сначала пропускаются OFFSET строк, а затем начинается подсчет LIMIT строк, которые возвращаются.
При использовании LIMIT важно использовать предложение ORDER BY, которое ограничивает строки результата в уникальном порядке. В противном случае вы получите непредсказуемое подмножество строк запроса. Вы можете запрашивать строки с десятой по двадцатую, но с десятой по двадцатую в каком порядке? Порядок неизвестен, если вы не указали ORDER BY.
Оптимизатор запросов учитывает ограничение LIMIT при
генерации планов запросов, поэтому вероятно, что вы получите разные
планы (приводящие к различным порядкам строк), в зависимости от того,
что вы указываете для LIMIT и OFFSET. Таким образом, использование
разных значений LIMIT/OFFSET для выбора
различных подмножеств результата запроса приведет к
непоследовательным результатам, если вы не обеспечите
предсказуемый порядок результатов с помощью ORDER BY. Это не ошибка; это
неизбежное следствие того факта, что SQL не обещает
поставлять результаты запроса в каком-либо определенном порядке, если
не используется ORDER BY для ограничения порядка.
Все строки, прне указанные с помощью предложения OFFSET, все равно должны быть вычислены внутри сервера; поэтому большое значение OFFSET может быть неэффективным.