get_customer_trans()
không phải là một bảng - có thể là một số thủ tục được lưu trữ, vì vậy truy vấn không thực sự tầm thường. Bạn cần phải xem thủ tục được lưu trữ này thực sự làm gì để hiểu tại sao nó có thể hoạt động chậm.
Tuy nhiên, bất kể hành vi thủ tục được lưu trữ như thế nào, việc thêm chỉ mục sau sẽ giúp ích rất nhiều:
CREATE INDEX do_not_email_tbl_idx1
ON do_not_email_tbl(do_not_email_address);
Chỉ mục này cho phép NOT IN
truy vấn để nhanh chóng trả lại câu trả lời. Tuy nhiên, NOT IN
được biết là có vấn đề trong các phiên bản PostgreSQL cũ hơn - vì vậy hãy đảm bảo rằng bạn đang chạy ít nhất là PostgreSQL 9.1 trở lên.
CẬP NHẬT . Cố gắng thay đổi truy vấn của bạn thành:
SELECT t.*
FROM get_customer_trans() AS t
WHERE NOT EXISTS (
SELECT 1
FROM do_not_email_tbl
WHERE do_not_email_address = t.user_email
LIMIT 1
)
Truy vấn này không sử dụng NOT IN
và sẽ hoạt động nhanh. Tôi nghĩ rằng trong PostgreSQL 9.2, truy vấn này sẽ hoạt động nhanh như truy vấn với NOT IN
mặc dù.