Tạo chỉ mục một phần, nhiều cột với thứ tự sắp xếp cụ thể sau:
CREATE INDEX products_status_sales_partial_idx ON products (status, sales DESC)
WHERE category NOT IN ('cat3','cat7');
Sửa đổi một chút truy vấn của bạn:
SELECT product_no, sales
FROM products
WHERE status = 'something'
AND category NOT IN ('cat3', 'cat7')
ORDER BY status, sales DESC
LIMIT 3;
Thêm status
là phần tử đầu tiên của ORDER BY
mệnh đề có vẻ thừa và vô nghĩa. Nhưng hãy thử.
Tại sao?
Người lập kế hoạch truy vấn không đủ thông minh để hiểu điều đó với
WHERE status = 'something' ...
ORDER BY sales DESC
thứ tự sắp xếp của chỉ mục (status, sales DESC)
phù hợp như một hệ quả hợp lý. Vì vậy, nó sẽ đọc tất cả các hàng đủ điều kiện, sắp xếp và chọn 3 hàng đầu.
Bằng cách thêm status
vào ORDER BY
bạn cho phép trình lập kế hoạch truy vấn đọc trực tiếp 3 mục nhập hàng đầu từ chỉ mục. Mong đợi tốc độ tăng lên vài bậc của cường độ .
Đã thử nghiệm với PostgreSQL 8.4 và 9.1.