get_customer_trans()
bukan tabel - mungkin beberapa prosedur tersimpan, jadi kueri tidak terlalu sepele. Anda perlu melihat apa sebenarnya yang dilakukan prosedur tersimpan ini untuk memahami mengapa ini bisa berjalan lambat.
Namun, terlepas dari perilaku prosedur tersimpan, menambahkan indeks berikut akan banyak membantu:
CREATE INDEX do_not_email_tbl_idx1
ON do_not_email_tbl(do_not_email_address);
Indeks ini memungkinkan NOT IN
kueri untuk mengembalikan jawaban dengan cepat. Namun, NOT IN
diketahui memiliki masalah dalam versi PostgreSQL yang lebih lama - jadi pastikan Anda menjalankan setidaknya PostgreSQL 9.1 atau yang lebih baru.
PERBARUI . Coba ubah kueri Anda menjadi:
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
)
Kueri ini tidak menggunakan NOT IN
, dan harus bekerja dengan cepat. Saya pikir di PostgreSQL 9.2 kueri ini harus bekerja secepat kueri dengan NOT IN
sekalipun.