результата выборки?
Почему он вынужден идти по всей таблице, когда результат выборки не отсортирован?
Все ответы, которые я слышу: "это потому что данные не отсортированы", но это не ответ на мой вопрос..
Буду крайне благодарен, если поможете. Сижу на этим уже со вчерашнего дня
Хочешь получить на выходе говно?
убери offset, оставь limit -эффект будет такой же.
Нет, я хочу понять, почему когда результат выборки не отсортирован, offset вынужден идти по всей таблице, вместо того, чтобы сразу взять данные из результата выборки
Он не вынужден. Ты лучше пришли описание таблиц (DDL) и запрос, и тогда можно обсудить.
Мне везде говорят (вот абсолютно везде), что offset будет считывать всю таблицу, если результат выборки не отсортирован
Однозначно без запроса это сказать нельзя. Да и с запросом тоже, план составляет СУБД, и она может делать это как угодно. Я бы на месте производителя СУБД OFFSET без ORDER BY просто игнорировал бы
зачем тебе вообще OFFSET - это же идиотская конструкция ...
Для пагинации. Есть альтернативы?
Пагинацию вообще не надо делать, надо её выбрасывать.
Не по всей, а только offset+limit. Но если limit не указан, тогда что есть offset (получаем строки с n позиции), что нет (получаем все строки). Особой разницы не будет(в случае, если не используется ключ). Это всего лишь маркер с какой строки начинать отдачу данных. И именно с этим и связана концепция, что если запрос возвращает более 500 записей (у каждого это своя граница), значит пользователь делает что то не так. Такое допустимо только в процессах, где пользователь не участвует (импорты/экспорту/конвертации/автоматические обработки данных), но там и offset как раз таки обычно не нужен, там как раз используют last row id of previous query + limit. Более того, сортировка вообще не влияет на скорость offset. Если сделать селект по обычной таблице без условий where, то очевидно, что будут браться строки по первичному ключу, который отсортирован. И вот именно по таблице ключей и можно применить offset и limit и по выбранным ключам уже строить результат. Если запрос сложный, то там у итогового результата может и не быть конечного ключа или сортировка не по ключевому полю, и тогда тут offset применится к результату выборки. Но опять же повторюсь. Результат может давать и 10 строк и 1000000 строк и скорость будет падать при отборе, а не применении offset.
Обсуждают сегодня