Làm thế nào chúng ta nên xử lý các hàng sẽ không được truy vấn khi chúng đã cũ trong PostgreQuery?


7

Chúng tôi có một bảng trong cơ sở dữ liệu PostgreSQL đang phát triển theo thứ tự hàng triệu hàng mỗi ngày.

Mỗi hàng bao gồm:

ID
Foreign user ID
Date and time
Other data

Ngày và giờ không hoàn toàn đơn điệu với ID, tuy nhiên chúng gần nhau.

Khi truy vấn bảng này, chúng tôi chỉ quan tâm đến việc nhận hàng cho một ID người dùng nước ngoài nhất định, với ngày và giờ trong hai tuần qua. Hàng hơn hai tuần tuổi sẽ không bao giờ được truy vấn, tuy nhiên chúng tôi muốn giữ chúng cho mục đích lưu trữ.

Cho trường hợp sử dụng đặc biệt này:

  1. Chúng ta có nên có một chỉ mục trên cột ngày và thời gian?
  2. Có bất cứ gợi ý nào chúng tôi có thể đưa ra rằng ngày và giờ (gần như) tăng đơn điệu với ID.
  3. Chúng ta có nên xem xét việc cố gắng loại bỏ các hàng cũ hơn hai tuần khỏi bảng, điều đó có khả năng cải thiện hiệu suất không?

Câu trả lời:


6
  1. Phân vùng và / hoặc sử dụng các chỉ mục một phần, do đó bạn chỉ có một chỉ mục cho phần bạn quan tâm
  2. Không, AFAIK không có gợi ý tương quan nào trong PG. Điều đáng tiếc.
  3. Phụ thuộc rất nhiều vào loại truy vấn, nhưng nó có thể đáng làm, đặc biệt nếu bạn có thể làm điều đó bằng cách phân vùng.

Vách ngăn

Đây là một cách sử dụng cổ điển để phân vùng bảng. Phân vùng bảng thành hai (hoặc nhiều) phần, một phần có dữ liệu nóng và một phần có dữ liệu lưu trữ cũ. Lập chỉ mục bất cứ điều gì bạn cần trên bàn nóng và sử dụng ít chỉ mục hơn để tiết kiệm không gian và tiết kiệm insertthời gian trên bàn lạnh.

Với loại trừ ràng buộc được bật, PG sẽ chỉ tự động quét new_tablekhi các truy vấn của bạn khớp với ràng buộc phân vùng.

Nếu tất cả các truy vấn của bạn không sử dụng cùng một ràng buộc, bạn có thể thêm một wherebài kiểm tra sử dụng ràng buộc đó hoặc chỉ truy vấn new_tabletrực tiếp phân vùng.

Chỉ số một phần

Thay phiên, bạn có thể tạo các chỉ mục một phần chỉ bao gồm các phạm vi bạn quan tâm. Một lần nữa, các chỉ mục này sẽ chỉ hoạt động nếu các truy vấn của bạn sử dụng các ràng buộc PG có thể nhận ra là khớp với chỉ mục một phần. Trong trường hợp của bạn, bạn phải tạo và thả chúng theo thời gian để giữ cho phạm vi thời gian của bạn có liên quan, vì bạn không thể lập chỉ mục cho một biểu thức động như thế nào WHERE (some_field > current_timestamp - INTERVAL '2' week).


4
Một activecờ có thể được sử dụng để tạo một chỉ mục một phần, nhưng điều đó sẽ yêu cầu đặt các hàng "cũ" thành active = falseví dụ như một công việc định kỳ
a_horse_with_no_name

2
@a_horse_with_no_name Yep; cá nhân tôi chỉ phân vùng activevà sử dụng loại trừ ràng buộc trong trường hợp đó, vì dù sao bạn cũng đang viết lại dữ liệu; cùng một ý tưởng, và điểm tốt.
Craig Ringer

Cảm ơn bạn đã phản hồi toàn diện và ý tưởng. Nhiều nghiệp chướng hơn cho một câu hỏi tiếp theo .
davetapley
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.