PostgreSQL 13: paginaci贸n feliz CON LAZOS

La semana pasada se publicaron dos art铆culos a la vez (de Hubert 'depesz' Lubaczewski y del propio autor del parche, Alvaro Herrera ), dedicados al soporte de la opci贸n WITH TIESdel est谩ndar SQL: 2008 implementado en la pr贸xima versi贸n de PostgreSQL 13 :

OFFSET start { ROW | ROWS }

FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } { ONLY | WITH TIES }
驴Qu茅 es y c贸mo elimina los problemas de implementaci贸n de paginaci贸n que mencion茅 en PostgreSQL Antipatterns: Registry Navigation ?







D茅jame recordarte que en ese art铆culo nos detuvimos en el punto que si tenemos un cartel como este:



CREATE TABLE events(
  id
    serial
      PRIMARY KEY
, ts
    timestamp
, data
    json
);

INSERT INTO events(ts)
SELECT
  now() - ((random() * 1e8) || ' sec')::interval
FROM
  generate_series(1, 1e6);


... entonces, para organizar la paginaci贸n cronol贸gica por 茅l (por ts DESC) es m谩s eficaz utilizar el siguiente 铆ndice:



CREATE INDEX ON events(ts DESC);


... y este modelo de consulta:



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;


Buena vieja subconsulta



Veamos el plan para una consulta de este tipo, si queremos obtener el siguiente segmento desde principios de este a帽o:



EXPLAIN (ANALYZE, BUFFERS)
SELECT
  *
FROM
  events
WHERE
  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;




[mira explica.tensor.ru]



驴Por qu茅 hay una consulta anidada aqu铆? Exactamente para no tener los problemas descritos en ese art铆culo con "saltar" los mismos valores de la clave de clasificaci贸n entre los segmentos solicitados:







Probar CON LAZOS "a los dientes"



Pero esto es exactamente para lo que WITH TIESse necesita la funcionalidad : 隆seleccionar todos los registros con el mismo valor de la clave de l铆mite a la vez !



EXPLAIN (ANALYZE, BUFFERS)
SELECT
  *
FROM
  events
WHERE
  ts < '2020-01-01'::timestamp
ORDER BY
  ts DESC
FETCH FIRST 26 ROWS WITH TIES;




[mira explica.tensor.ru] La



consulta parece mucho m谩s simple, casi 2 veces m谩s r谩pida, y en solo una Index Scan, 隆un resultado excelente!



Tenga en cuenta que a pesar de que "ordenamos" s贸lo 26 registros, Index Scanextraje uno m谩s , solo para asegurarme de que el "siguiente" ya no nos conviene.







Bueno, estamos esperando el lanzamiento oficial de PostgreSQL 13, que est谩 programado para ma帽ana.



All Articles