PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Postgres:Verwenden von Zeitstempeln für die Paginierung

Lassen Sie mich Dinge von Kommentaren zu meiner Antwort umschreiben. Sie möchten timestamp verwenden statt integer eingeben einfach weil es genau dafür konzipiert wurde. Manuelle Konvertierungen zwischen Zeitstempel-Ganzzahlen und timestamp Objekte ist nur ein Schmerz und Sie gewinnen nichts. Und Sie werden es eventuell für komplexere datetime-basierte Abfragen benötigen.

Um eine Frage zur Paginierung zu beantworten. Sie machen einfach eine Abfrage

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

Wenn es sich um die erste Abfrage handelt, setzen Sie beispielsweise lastTimestamp = '3000-01-01' . Andernfalls setzen Sie lastTimestamp = last_query.last_row.created .

Optimierung

Beachten Sie, dass wenn die Tabelle groß ist, ORDER BY created DESC möglicherweise nicht effizient (insbesondere wenn sie parallel mit unterschiedlichen Reichweiten aufgerufen werden). In diesem Fall können Sie z. B. bewegliche "Zeitfenster" verwenden:

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

Der 1 day Intervall wird willkürlich ausgewählt (stimmen Sie es auf Ihre Bedürfnisse ab). Sie können die Ergebnisse auch in der App sortieren.

Wenn die Ergebnisse nicht leer sind, aktualisieren Sie (in Ihrer App)

lastTimestamp = last_query.last_row.created

(vorausgesetzt, Sie haben die Sortierung abgeschlossen, andernfalls benötigen Sie min(last_query.row.created) )

Wenn Ergebnisse leer sind, wiederholen Sie die Abfrage mit lastTimestamp = lastTimestamp - interval '1 day' bis du etwas geholt hast. Außerdem müssen Sie stoppen, wenn lastTimestamp zu niedrig wird, d. h. wenn er niedriger ist als jeder andere Zeitstempel in der Tabelle (der vorab abgerufen werden muss).

All dies unterliegt einigen Annahmen für Einfügungen:

  1. new_row.created >= any_row.created und
  2. new_row.created ~ current_time
  3. Die Verteilung von new_row.created ist mehr oder weniger einheitlich

Annahme 1 stellt sicher, dass die Paginierung zu konsistenten Daten führt, während Annahme 2 nur für den Standardwert 3000-01-01 benötigt wird Datum. Annahme 3 soll sicherstellen, dass Sie keine großen leeren Lücken haben, wenn Sie viele leere Abfragen ausgeben müssen.