Mặc dù không hữu ích cho một kế hoạch đơn giản như thế này, nhưng http://explain.depesz.com thực sự hữu ích. Xem http://explain.depesz.com/s/t4fi. Lưu ý tab "thống kê" và "tùy chọn" kéo xuống.
Những điều cần lưu ý về kế hoạch này:
-
Số hàng ước tính (183) có thể so sánh hợp lý với số hàng thực tế (25). Nó không phải là nhiều hơn hàng trăm lần, cũng không phải là 1. Bạn quan tâm hơn đến các đơn hàng có độ lớn khi nói đến ước tính số lượng hàng hoặc các vấn đề "1 so với không 1". (Bạn thậm chí không cần độ chính xác "đủ gần cho công việc của chính phủ" - "đủ gần cho kế toán hợp đồng quân sự" sẽ làm). Ước tính chọn lọc và thống kê có vẻ hợp lý.
-
Nó sử dụng chỉ mục một phần hai cột được cung cấp (
index scan using index_cars_onsale_on_brand_and_model_name
), vì vậy nó phù hợp với điều kiện chỉ mục một phần. Bạn có thể thấy điều đó trongFilter: has_auto_gear
. Điều kiện tìm kiếm chỉ mục cũng được hiển thị. -
Hiệu suất truy vấn có vẻ hợp lý vì số hàng của bảng sẽ có nghĩa là chỉ mục khá lớn, đặc biệt là vì nó trên hai cột. Các hàng phù hợp sẽ bị phân tán, vì vậy có khả năng mỗi hàng cũng sẽ yêu cầu một trang riêng được đọc.
Tôi thấy không có gì sai ở đây. Tuy nhiên, truy vấn này có thể sẽ được hưởng lợi rất nhiều từ việc quét chỉ mục của PostgreSQL 9.2.
Có thể có một số bảng cồng kềnh ở đây, nhưng với chỉ mục 2 cột và số hàng tuyệt đối, thời gian phản hồi không hoàn toàn vô lý, đặc biệt là đối với một bảng có 170 (!!) cột có khả năng phù hợp với tương đối ít bộ dữ liệu vào mỗi trang. Nếu bạn có thể đủ thời gian ngừng hoạt động, hãy thử VACUUM FULL
để tổ chức lại bảng và xây dựng lại chỉ mục. Điều này sẽ độc quyền khóa bảng trong một thời gian trong khi nó xây dựng lại nó. Nếu bạn không đủ khả năng dành thời gian ngừng hoạt động, hãy xem pg_reorg và / hoặc CREATE INDEX CONCURRENTLY
và ALTER INDEX ... RENAME TO
.
Bạn có thể tìm thấy EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
đôi khi nhiều thông tin hơn, vì nó có thể hiển thị các truy cập bộ đệm, v.v.
Một tùy chọn có thể làm cho truy vấn này nhanh hơn (mặc dù nó có nguy cơ làm chậm các truy vấn khác đôi chút) là phân vùng bảng trên brand
và bật constraint_exclusion
. Xem phân vùng.