API
Pagination: тест на припоминание
Припоминание сильнее перечитывания. На каждую подсказку проговорите или запишите полный ответ по памяти, прежде чем открыть модельный — именно усилие припоминания закрепляет механизм.
Восстановите ключевые механизмы юнита — почему offset растёт с глубиной, почему он дрейфует, что делает keyset-ключ валидным, почему cursor непрозрачен и почему точный подсчёт дорог — не подглядывая в урок.
- 01Почему LIMIT 20 OFFSET 200000 становится медленнее на глубине, хотя всегда возвращает 20 строк?
- 02Объясните result drift: почему offset-лента показывает дубликаты и пропуски и почему даже на маленькой таблице?
- 03Какими двумя свойствами должен обладать keyset-ключ сортировки и что ломается, если ключ не уникален?
- 04Зачем отдавать opaque cursor вместо сырых ключей (created_at, id) и что клиент с ним делает?
- 05Что keyset отдаёт по сравнению с offset и когда offset всё ещё верный выбор?
- 06Почему точный итог дорог в Postgres и каковы альтернативы в порядке предпочтения?
Если вы восстановили каждый ответ по памяти, у вас есть стержень юнита: стоимость offset растёт с глубиной, потому что движок читает и отбрасывает все предыдущие строки; offset дрейфует, потому что позиция не стабильный адрес при записи; валидный keyset-ключ уникален, стабилен и подкреплён индексом, сравнивается как целый кортеж; cursor непрозрачен, чтобы контракт мог эволюционировать, а клиенты не собирали дорогие seek; keyset обменивает произвольные переходы по страницам на плоскую задержку, поэтому offset всё ещё подходит ограниченным админским поверхностям; а точный подсчёт это полный скан под MVCC, поэтому оценивайте или зондируйте через n+1.