PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Postgres:menggunakan stempel waktu untuk pagination

Biarkan saya menulis ulang hal-hal dari komentar untuk jawaban saya. Anda ingin menggunakan timestamp ketik alih-alih integer hanya karena untuk itulah ia dirancang. Melakukan konversi manual antara bilangan bulat stempel waktu dan timestamp objek hanyalah rasa sakit dan Anda tidak mendapatkan apa-apa. Dan pada akhirnya Anda akan membutuhkannya untuk kueri berbasis datetime yang lebih kompleks.

Untuk menjawab pertanyaan tentang pagination. Anda cukup melakukan kueri

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

Jika ini adalah kueri pertama maka Anda menetapkan mengatakan lastTimestamp = '3000-01-01' . Jika tidak, Anda menyetel lastTimestamp = last_query.last_row.created .

Pengoptimalan

Perhatikan bahwa jika tabelnya besar maka ORDER BY created DESC mungkin tidak efisien (terutama jika disebut secara paralel dengan rentang yang berbeda). Dalam hal ini Anda dapat menggunakan "jendela waktu" yang bergerak, misalnya:

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

1 day interval dipilih secara sewenang-wenang (sesuaikan dengan kebutuhan Anda). Anda juga dapat mengurutkan hasil di aplikasi.

Jika hasilnya tidak kosong maka Anda memperbarui (di aplikasi Anda)

lastTimestamp = last_query.last_row.created

(dengan asumsi Anda telah selesai menyortir, jika tidak, Anda mengambil min(last_query.row.created) )

Jika hasil kosong maka ulangi kueri dengan lastTimestamp = lastTimestamp - interval '1 day' sampai Anda mengambil sesuatu. Anda juga harus berhenti jika lastTimestamp menjadi terlalu rendah, yaitu saat lebih rendah dari stempel waktu lainnya dalam tabel (yang harus diambil terlebih dahulu).

Semua itu di bawah beberapa asumsi untuk sisipan:

  1. new_row.created >= any_row.created dan
  2. new_row.created ~ current_time
  3. Distribusi new_row.created kurang lebih seragam

Asumsi 1 memastikan bahwa pagination menghasilkan data yang konsisten sementara asumsi 2 hanya diperlukan untuk 3000-01-01 default tanggal. Asumsi 3 adalah untuk memastikan bahwa Anda tidak memiliki celah kosong yang besar ketika Anda harus mengeluarkan banyak kueri kosong.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP dan Postgres:menangkap kesalahan?

  2. Bagaimana cara mengatur fungsi PostgreSQL sebagai nilai default di GORM?

  3. PostgreSQL dan nodejs/pg, kembalikan JSON bersarang

  4. Skema PostgreSQL / Ruang Nama dengan Django

  5. Variabel yang berisi jumlah baris yang terpengaruh oleh DELETE sebelumnya? (dalam sebuah fungsi)