sql >> データベース >  >> RDS >> PostgreSQL

NOT INを使用すると、PostgreSQLのクエリが遅くなります

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



    1. SQL固定値IN()とINNERJOINのパフォーマンス

    2. PHPを使用してSSL経由でMySQLに接続する

    3. エミュレートされたプリペアドステートメントと実際のプリペアドステートメント

    4. $ stmt-> close()vs $ stmt-> free_result()