sql >> Base de Datos >  >> RDS >> PostgreSQL

Postgres:uso de marcas de tiempo para la paginación

Permítanme reescribir las cosas de los comentarios a mi respuesta. Quiere usar timestamp escriba en lugar de integer simplemente porque eso es exactamente para lo que fue diseñado. Hacer conversiones manuales entre enteros de marca de tiempo y timestamp objetos es sólo un dolor y no ganas nada. Y eventualmente lo necesitará para consultas más complejas basadas en fecha y hora.

Para responder a una pregunta sobre paginación. Simplemente haces una consulta

SELECT *
FROM table_name
WHERE created < lastTimestamp
ORDER BY created DESC
LIMIT 30

Si es la primera consulta, establece decir lastTimestamp = '3000-01-01' . De lo contrario, establezca lastTimestamp = last_query.last_row.created .

Optimización

Tenga en cuenta que si la tabla es grande, entonces ORDER BY created DESC podría no ser eficiente (especialmente si se llama en paralelo con diferentes rangos). En este caso, puede usar "ventanas de tiempo" móviles, por ejemplo:

SELECT *
FROM table_name
WHERE
    created < lastTimestamp
    AND created >= lastTimestamp - interval '1 day'

El 1 day el intervalo se elige arbitrariamente (sintonícelo según sus necesidades). También puede ordenar los resultados en la aplicación.

Si los resultados no están vacíos, actualice (en su aplicación)

lastTimestamp = last_query.last_row.created

(suponiendo que haya ordenado, de lo contrario, toma min(last_query.row.created) )

Si los resultados están vacíos, repite la consulta con lastTimestamp = lastTimestamp - interval '1 day' hasta que traigas algo. También debe detenerse si lastTimestamp pasa a ser demasiado bajo, es decir, cuando es más bajo que cualquier otra marca de tiempo en la tabla (que debe precargarse).

Todo eso está bajo algunos supuestos para las inserciones:

  1. new_row.created >= any_row.created y
  2. new_row.created ~ current_time
  3. La distribución de new_row.created es más o menos uniforme

La suposición 1 garantiza que la paginación dé como resultado datos coherentes, mientras que la suposición 2 solo es necesaria para el 3000-01-01 predeterminado. fecha. El supuesto 3 es asegurarse de que no tenga grandes espacios vacíos cuando tenga que emitir muchas consultas vacías.