PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Truy vấn PostgreSQL chậm khi sử dụng NOT IN

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ù.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. tạo Nhà cung cấp EJB javax.persistence.PersistenceContext.synchronization () Ljavax / Persence / SynchronizationType

  2. Làm cách nào để chèn chú thích cột trong PostgreSQL thông qua Python?

  3. COPY hoạt động như thế nào và tại sao nó nhanh hơn INSERT rất nhiều?

  4. Postgres JSONB đệ quy

  5. Làm cách nào để sử dụng một biến làm tên bảng trong node-pg?