WITH TIES
del 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 TIES
se 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 Scan
extraje 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.