Tôi vừa mới cấu trúc lại cơ sở dữ liệu của mình để sử dụng partitioning trong Postgres 8.2. Bây giờ tôi gặp sự cố với hiệu suất truy vấn:Truy vấn hiệu quả bảng Postgres đa phân vùng
SELECT *
FROM my_table
WHERE time_stamp >= '2010-02-10' and time_stamp < '2010-02-11'
ORDER BY id DESC
LIMIT 100;
Có 45 triệu hàng trong bảng. Trước khi phân vùng, thao tác này sẽ sử dụng quét chỉ mục đảo ngược và dừng ngay sau khi đạt đến giới hạn.
Sau khi phân vùng (trên phạm vi thời gian_stamp), Postgres thực hiện quét chỉ mục đầy đủ của bảng chính và phân vùng có liên quan và hợp nhất các kết quả, sắp xếp chúng, sau đó áp dụng giới hạn. Điều này mất quá nhiều thời gian.
tôi có thể sửa chữa nó với:
SELECT * FROM (
SELECT *
FROM my_table_part_a
WHERE time_stamp >= '2010-02-10' and time_stamp < '2010-02-11'
ORDER BY id DESC
LIMIT 100) t
UNION ALL
SELECT * FROM (
SELECT *
FROM my_table_part_b
WHERE time_stamp >= '2010-02-10' and time_stamp < '2010-02-11'
ORDER BY id DESC
LIMIT 100) t
UNION ALL
... and so on ...
ORDER BY id DESC
LIMIT 100
này chạy một cách nhanh chóng. Các phân vùng có dấu thời gian nằm ngoài phạm vi thậm chí không được bao gồm trong kế hoạch truy vấn.
Câu hỏi của tôi là: Có một số gợi ý hoặc cú pháp tôi có thể sử dụng trong Postgres 8.2 để ngăn trình hoạch định truy vấn quét toàn bộ bảng nhưng vẫn sử dụng cú pháp đơn giản chỉ đề cập đến bảng chính không?
Về cơ bản, tôi có thể tránh được nỗi đau khi tự động xây dựng truy vấn UNION lớn trên mỗi phân vùng xảy ra hiện được xác định không?
EDIT: Tôi đã constraint_exclusion kích hoạt (nhờ @ Vinko Vrsalovic)
8.2? có thật không? Trước khi thực hiện bất cứ điều gì khác, bạn nên xem xét nâng cấp lên phiên bản được hỗ trợ (và hiện tại) của Postgres (9.2 là phiên bản hiện tại) –