Русский
Русский
English
Статистика
Реклама

PostgreSQL 13 happy pagination WITH TIES

На прошедшей неделе вышло сразу две статьи (от Hubert 'depesz' Lubaczewski и автора самого патча Alvaro Herrera), посвященные реализованной в грядущей версии PostgreSQL 13 поддержке опции WITH TIES из стандарта SQL:2008:
OFFSET start { ROW | ROWS }
FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } { ONLY | WITH TIES }
Что это, и как оно избавляет от проблем с реализацией пейджинга, о которых я рассказывал в статье PostgreSQL Antipatterns: навигация по реестру?



Напомню, что в той статье мы остановились на моменте, что если у нас есть табличка такого вида:

CREATE TABLE events(  id    serial      PRIMARY KEY, ts    timestamp, data    json);INSERT INTO events(ts)SELECT  now() - ((random() * 1e8) || ' sec')::intervalFROM  generate_series(1, 1e6);

то для организации хронологического пейджинга по ней (по ts DESC) эффективнее всего использовать вот такой индекс:

CREATE INDEX ON events(ts DESC);

и вот такую модель запроса:

SELECT  ...WHERE  ts < $1 AND  ts >= coalesce((    SELECT      ts    FROM      events    WHERE      ts < $1    ORDER BY      ts DESC    LIMIT 1 OFFSET 25  ), '-infinity')ORDER BY  ts DESC;

Старый-добрый подзапрос


Давайте посмотрим на план такого запроса, если мы хотим получить очередной сегмент от начала этого года:

EXPLAIN (ANALYZE, BUFFERS)SELECT  *FROM  eventsWHERE  ts < '2020-01-01'::timestamp AND  ts >= coalesce((    SELECT      ts    FROM      events    WHERE      ts < '2020-01-01'::timestamp    ORDER BY      ts DESC    LIMIT 1 OFFSET 25  ), '-infinity')ORDER BY  ts DESC;


[посмотреть на explain.tensor.ru]

Зачем тут вложенный запрос? Ровно за тем, чтобы не иметь описанных в той статье проблем с перепрыгиванием одинаковых значений ключа сортировки между запрашиваемыми сегментами:



Пробуем WITH TIES на зуб


Но ведь ровно для этого и нужен функционал WITH TIES чтобы отобрать сразу все записи с одинаковым значением граничного ключа!

EXPLAIN (ANALYZE, BUFFERS)SELECT  *FROM  eventsWHERE  ts < '2020-01-01'::timestampORDER BY  ts DESCFETCH FIRST 26 ROWS WITH TIES;


[посмотреть на explain.tensor.ru]

Запрос выглядит гораздо проще, почти в 2 раза быстрее, и всего лишь за один Index Scan отличный результат!

Обратите внимание, что хоть мы и заказывали всего 26 записей, Index Scan извлек на одну больше ровно для того, чтобы убедиться, что следующая нам уже не подходит.



Ну что же, ждем официального релиза PostgreSQL 13, который запланирован на завтра.
Источник: habr.com
К списку статей
Опубликовано: 23.09.2020 12:10:47
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Блог компании тензор

Высокая производительность

Postgresql

Sql

Администрирование баз данных

Postgresql 13

Sql tips and tricks

With ties

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru