PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Postgres:sử dụng dấu thời gian để phân trang

Hãy để tôi viết lại những điều từ nhận xét đến câu trả lời của tôi. Bạn muốn sử dụng timestamp nhập thay vì integer đơn giản vì đó chính xác là những gì nó được thiết kế. Thực hiện chuyển đổi thủ công giữa các số nguyên dấu thời gian và timestamp đối tượng chỉ là một nỗi đau và bạn không đạt được gì. Và cuối cùng bạn sẽ cần nó cho các truy vấn dựa trên ngày giờ phức tạp hơn.

Để trả lời một câu hỏi về phân trang. Bạn chỉ cần thực hiện một truy vấn

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

Nếu đó là truy vấn đầu tiên thì bạn đặt nói lastTimestamp = '3000-01-01' . Nếu không, bạn đặt lastTimestamp = last_query.last_row.created .

Tối ưu hóa

Lưu ý rằng nếu bảng lớn thì ORDER BY created DESC có thể không hiệu quả (đặc biệt nếu được gọi song song với các phạm vi khác nhau). Trong trường hợp này, bạn có thể sử dụng "cửa sổ thời gian" di chuyển, ví dụ:

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

1 day khoảng thời gian được chọn tùy ý (điều chỉnh nó theo nhu cầu của bạn). Bạn cũng có thể sắp xếp kết quả trong ứng dụng.

Nếu kết quả không trống thì bạn cập nhật (trong ứng dụng của bạn)

lastTimestamp = last_query.last_row.created

(giả sử bạn đã sắp xếp xong, nếu không, bạn mất min(last_query.row.created) )

Nếu kết quả trống thì bạn lặp lại truy vấn với lastTimestamp = lastTimestamp - interval '1 day' cho đến khi bạn tìm nạp một thứ gì đó. Ngoài ra, bạn phải dừng nếu lastTimestamp trở nên thấp, tức là khi nó thấp hơn thì bất kỳ dấu thời gian nào khác trong bảng (phải được tìm nạp trước).

Tất cả những điều đó đều nằm trong một số giả định cho việc chèn:

  1. new_row.created >= any_row.created
  2. new_row.created ~ current_time
  3. Việc phân phối new_row.created ít nhiều đều đồng nhất

Giả định 1 đảm bảo rằng việc phân trang dẫn đến dữ liệu nhất quán trong khi giả định 2 chỉ cần thiết cho 3000-01-01 mặc định ngày. Giả định 3 là đảm bảo rằng bạn không có những khoảng trống lớn khi bạn phải đưa ra nhiều truy vấn trống.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chỉ mục tổng hợp có ba khóa, điều gì sẽ xảy ra nếu tôi truy vấn bỏ qua khóa ở giữa?

  2. Tại sao Rails / ActiveRecord cung cấp một hằng số không phải là số nguyên Postgres SyntaxError trong ORDER?

  3. django cách xác định mô hình cho nhiều bảng hiện có trong cơ sở dữ liệu postgresql

  4. Nếu có thể thì làm cách nào để nhúng PostgreSQL?

  5. Cách tạo hàm không trả về