当使用NOT IN时,PostgreSQL查询很慢[英] PostgreSQL query is slow when using NOT IN

本文是小编为大家收集整理的关于当使用NOT IN时,PostgreSQL查询很慢的处理方法,想解了当使用NOT IN时,PostgreSQL查询很慢的问题怎么解决?当使用NOT IN时,PostgreSQL查询很慢问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我有一个 PostgreSQL 函数,它可以非常快地将查询结果返回到 pgadmin 结果网格.在内部,这是一个简单的函数,它使用 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 子句更快的方法吗?

推荐答案

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 中,这个查询应该和 NOT IN 一样快.

本文地址:https://www.itbaoku.cn/post/1763959.html