2013-05-19 43 views
5

Tôi có một bảng có trường datetime là "updated_at". Rất nhiều truy vấn của tôi sẽ được truy vấn trên trường này bằng cách sử dụng các truy vấn phạm vi như các hàng đã cập nhật_at> một ngày nhất định.Postgres: Tối ưu hóa truy vấn theo datetime

Tôi đã thêm chỉ mục vào updated_at, nhưng hầu hết các truy vấn của tôi vẫn còn rất chậm, ngay cả khi tôi có giới hạn về số hàng trả về.

Tôi có thể làm gì khác để tối ưu hóa các truy vấn truy vấn trên trường ngày giờ?

+5

Bạn có thể đăng kế hoạch giải thích, tổng số hàng và giá trị chính xác "rất chậm" không? –

+0

Vui lòng đọc http://stackoverflow.com/tags/postgresql-performance/info (và trang wiki Truy vấn SlowQueryQuestions) sau đó cập nhật câu hỏi của bạn với kết quả 'giải thích phân tích' phù hợp và báo cáo lại. Vì bạn đang sử dụng trình tạo truy vấn, bạn có thể cần phải sử dụng 'auto_explain' hoặc để truy vấn nhật ký và thực hiện lại chúng bằng tay. –

+0

Vui lòng đăng giản đồ và loại truy vấn chậm. Câu hỏi vì nó được phân tích không thể trả lời một cách hợp lý ... –

Trả lời

1

Thông thường, trình tối ưu hóa cơ sở dữ liệu sẽ không chọn sử dụng chỉ mục cho các phạm vi kết thúc mở, chẳng hạn như updated_at > somedate.

Nhưng trong nhiều trường hợp cột datatime sẽ không vượt quá "bây giờ", vì vậy bạn có thể giữ gìn ngữ nghĩa của > somedate bằng cách chuyển đổi các điều kiện để một loạt bằng cách sử dụng between như thế này:

where updated_at between somedate and current_timestamp 

Một vị từ between có nhiều khả năng khiến trình tối ưu hóa chọn sử dụng chỉ mục.


Vui lòng đăng cách tiếp cận này cải thiện hiệu suất của mỏ đá.

+2

Điều này có thực sự đúng với PostgreSQL không? Tôi sẽ nghĩ rằng trình tối ưu hóa sẽ xem xét phạm vi giá trị trong cột có liên quan, thông qua pg_statistics và tạo ra một số lượng ước tính của tập hợp kết quả cho vị từ. Nếu giá trị tối đa nhỏ hơn hoặc bằng current_timestamp thì tôi sẽ không nghĩ rằng sẽ có nhiều sự khác biệt. Thú vị cho Henley để kiểm tra mặc dù - kế hoạch giải thích sẽ tiết lộ tất cả. –

+0

@DavidAldridge trong kinh nghiệm của tôi, '>' chỉ là không được tối ưu hóa tốt. Tôi cũng thích Harvey đăng kết quả. – Bohemian

+3

Postgres ** sẽ ** sử dụng chỉ mục cho '>' nếu nó hữu ích. Không cần phải cho một 'giữa': Xem ở đây cho một ví dụ http://sqlfiddle.com/#!12/e3142/3 Tất cả phụ thuộc - như thường lệ với một chỉ mục - có hay không chi phí sử dụng một chỉ số ít hơn so với cái gì khác –

0

Giả sử rằng các chỉ số đang được sử dụng nhưng hiệu suất vẫn còn nghèo, biện pháp khắc phục duy nhất tôi có thể nghĩ đến là cụm bảng bằng chỉ số: http://www.postgresql.org/docs/9.1/static/sql-cluster.html

này sẽ di chuyển các hàng với giá trị update_at cùng là đồng vị trí vật lý, cải thiện hiệu suất truy vấn truy cập bảng đó thông qua chỉ mục, đặc biệt đối với các lần quét phạm vi rộng.

Chú ý đến các cảnh báo trong tài liệu mặc dù và lưu ý rằng khi các hàng được cập nhật thì việc phân cụm không được giữ nguyên.

Ngoài ra:

Khi một bảng đã được nhóm, một TRUY CẬP khóa ĐỘC QUYỀN được mua lại trên đó. Điều này ngăn cản bất kỳ hoạt động cơ sở dữ liệu khác (cả đọc và viết) từ hoạt động trên bảng cho đến khi CLUSTER kết thúc.

Dựa trên những hạn chế này, nó có thể không phải là giải pháp khả thi cho trường hợp của bạn, nhưng có thể hữu ích cho người khác.

3

Đối với bất kỳ truy vấn cụ thể, việc sử dụng một chỉ số phụ thuộc vào chi phí của việc sử dụng chỉ số so sánh với một quét tuần tự

thường các nhà phát triển nghĩ rằng vì có một chỉ số, một truy vấn nên chạy nhanh hơn, và nếu truy vấn chạy chậm, chỉ mục là giải pháp. Điều này thường xảy ra khi truy vấn sẽ trả về một vài bộ dữ liệu. Nhưng khi số lượng bộ dữ liệu trong kết quả tăng lên, chi phí sử dụng chỉ mục có thể tăng lên.

Bạn đang sử dụng postgres. Postgres không hỗ trợ phân cụm quanh một thuộc tính đã cho. Điều đó có nghĩa là postgres, khi đối mặt với một truy vấn phạm vi (thuộc loại att> a và att < b) cần tính toán số lượng bộ dữ liệu trong kết quả (đảm bảo bạn hút cơ sở dữ liệu thường xuyên) và chi phí sử dụng chỉ số so với quét tuần tự. sau đó nó sẽ quyết định sử dụng phương pháp nào.

bạn có thể kiểm tra quyết định này bằng cách chạy

EXPLAIN ANALYZE <query>; 

trong psql. Nó sẽ cho bạn biết nếu nó sử dụng một chỉ mục hay không. Nếu bạn thực sự, thực sự muốn sử dụng các chỉ mục thay vì quét tuần tự (đôi khi cần) và bạn thực sự biết bạn đang làm gì, bạn có thể thay đổi chi phí quét tuần tự trong hằng số kế hoạch hoặc vô hiệu hóa quét tuần tự có lợi cho bất kỳ phương pháp nào khác. Xem trang này để các chi tiết:

http://www.postgresql.org/docs/9.1/static/runtime-config-query.html

Hãy chắc chắn rằng bạn duyệt phiên bản đúng của tài liệu.

--dmg

Các vấn đề liên quan