PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Postgres:używanie znaczników czasu do paginacji

Pozwólcie, że przepiszę rzeczy od komentarzy do mojej odpowiedzi. Chcesz użyć timestamp wpisz zamiast integer po prostu dlatego, że właśnie do tego został zaprojektowany. Wykonywanie ręcznych konwersji między liczbami całkowitymi znacznika czasu a timestamp przedmioty to tylko ból i nic nie zyskujesz. I w końcu będziesz go potrzebować do bardziej złożonych zapytań opartych na datach i godzinach.

Aby odpowiedzieć na pytanie o paginację. Wystarczy wykonać zapytanie

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

Jeśli jest to pierwsze zapytanie, ustaw powiedz lastTimestamp = '3000-01-01' . W przeciwnym razie ustawisz lastTimestamp = last_query.last_row.created .

Optymalizacja

Zauważ, że jeśli tabela jest duża, to ORDER BY created DESC może nie być wydajne (zwłaszcza jeśli wywołane równolegle z różnymi zakresami). W takim przypadku możesz użyć ruchomych „okien czasowych”, na przykład:

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

1 day interwał jest wybierany dowolnie (dostosuj go do swoich potrzeb). Możesz także sortować wyniki w aplikacji.

Jeśli wyniki nie są puste, aktualizujesz (w swojej aplikacji)

lastTimestamp = last_query.last_row.created

(zakładając, że wykonałeś sortowanie, w przeciwnym razie zajmiesz min(last_query.row.created) )

Jeśli wyniki są puste, powtarzasz zapytanie z lastTimestamp = lastTimestamp - interval '1 day' dopóki czegoś nie przyniesiesz. Musisz także zatrzymać się, jeśli lastTimestamp staje się zbyt niski, tj. gdy jest niższy niż jakikolwiek inny znacznik czasu w tabeli (który musi być wstępnie pobrany).

Wszystko to odbywa się pod pewnymi założeniami dotyczącymi wkładek:

  1. new_row.created >= any_row.created i
  2. new_row.created ~ current_time
  3. Dystrybucja new_row.created jest mniej więcej jednolita

Założenie 1 zapewnia, że ​​podział na strony daje spójne dane, podczas gdy założenie 2 jest potrzebne tylko dla domyślnego 3000-01-01 data. Założeniem 3 jest upewnienie się, że nie masz dużych pustych luk, gdy musisz wysłać wiele pustych zapytań.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Arytmetyka kolumny daty w zapytaniu PostgreSQL

  2. Sprawdź, czy w tablicy Postgres istnieje NULL

  3. regexp_split_to_table i row_number

  4. Rekordy oparte na kursorach w PostgreSQL

  5. Funkcja plpgsql, która zwraca wiele kolumn, jest wywoływana wielokrotnie