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
を使用したクエリと同じくらい高速に動作するはずです。