6

クエリ結果をpgadmin結果グリッドに非常に高速に返すPostgreSQL関数があります。内部的には、これは を使用しdblinkて別のデータベースに接続し、単純に実行できるようにクエリを返す単純な関数です。

SELECT * FROM get_customer_trans();

また、基本的なテーブル クエリと同じように実行されます。

問題は、NOT IN句を使用するときです。したがって、次のクエリを実行したいのですが、時間がかかります。

SELECT * FROM get_customer_trans()
WHERE user_email NOT IN 
    (SELECT do_not_email_address FROM do_not_email_tbl);

どうすればこれをスピードアップできますか? NOT INこのシナリオの句よりも速いものはありますか?

4

2 に答える 2

18

get_customer_trans()はテーブルではありません - おそらく何らかのストアド プロシージャなので、クエリは簡単ではありません。このストアド プロシージャの動作が遅い理由を理解するには、このストアド プロシージャの実際の動作を確認する必要があります。

ただし、ストアド プロシージャの動作に関係なく、次のインデックスを追加すると非常に役立ちます。

CREATE INDEX do_not_email_tbl_idx1
    ON do_not_email_tbl(do_not_email_address);

このインデックスによりNOT IN、クエリはすばやく回答を返すことができます。ただし、NOT IN古い PostgreSQL バージョンでは問題があることが知られているため、少なくとも PostgreSQL 9.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、高速に動作するはずです。PostgreSQL 9.2 では、このクエリは 1 つと同じくらい速く動作するはずNOT INです。

于 2013-06-08T04:37:32.287 に答える