get_customer_trans() はテーブルではありません-おそらくいくつかのストアドプロシージャなので、クエリは実際には簡単ではありません。なぜ動作が遅くなるのかを理解するには、このストアドプロシージャが実際に何をするのかを調べる必要があります。
ただし、ストアドプロシージャの動作に関係なく、次のインデックスを追加すると非常に役立ちます。
CREATE INDEX do_not_email_tbl_idx1
ON do_not_email_tbl(do_not_email_address);
このインデックスにより、NOT IN すばやく回答を返すクエリ。ただし、NOT IN 古いバージョンのPostgreSQLで問題が発生することがわかっているため、少なくともPostgreSQL9.1以降を実行していることを確認してください。
更新 。クエリを次のように変更してみてください:
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
)
このクエリはNOT INを使用しません 、そして高速に動作するはずです。PostgreSQL9.2では、このクエリはNOT INを使用したクエリと同じくらい高速に動作するはずです。