使用NOT IN时,PostgreSQL查询速度较慢

使用NOT IN时,PostgreSQL查询速度较慢,sql,postgresql,Sql,Postgresql,我有一个PostgreSQL函数,它可以非常快速地将查询结果返回到pgadmin结果网格。 在内部,这是一个简单的函数,它使用dblink连接到另一个数据库,并执行查询返回,这样我就可以简单地运行 SELECT * FROM get_customer_trans(); 它就像一个基本的表查询一样运行 问题是当我使用NOT IN子句时。因此,我想运行以下查询,但这需要花费很长时间: SELECT * FROM get_customer_trans() WHERE user_email NOT I

我有一个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\u customer\u trans()
不是一个表-可能是一些存储过程,因此查询并不是很简单。您需要了解此存储过程的实际功能,以了解它可能运行缓慢的原因

但是,无论存储过程的行为如何,添加以下索引都会有很大帮助:

CREATE INDEX do_not_email_tbl_idx1
    ON do_not_email_tbl(do_not_email_address);
此索引允许
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
)
此查询不使用
不在
中,应能快速运行。 我认为在PostgreSQL 9.2中,这个查询应该和
中的查询一样快,而不是
中的查询。

只需这样做:

SELECT * FROM get_customer_trans() as t1 left join do_not_email_tbl as t2 
on user_email = do_not_email_address
where t2.do_not_email_address is null

我在do_not_email_tbl中已经有了该栏的索引。请注意,正如我提到的,函数返回的结果非常快
SELECT*from get\u customer\u trans()
将所有220万条记录快速返回查询结果网格。所以看起来功能很快。我想通过只获取那些不在do_not_email_tbl.AWEESOMEEEE!!!中的客户来进一步过滤结果!!!。非常感谢。您确定select 1的逻辑正确吗?我不熟悉notexists。在
notexists
中选择什么并不重要。它可以是任何东西,比如
*
0
或任何列名,
1
是最简单的书写方式。而
LIMIT 1
是否只是让sub-
选择
以首先停止搜索match@mvp我的猜测是
不存在
足够聪明,可以暗示
限制1
@ClodoaldoNeto:事实上,
限制1
是不需要的。
(不存在)
子查询的计算结果正好是一个布尔值;一(或多)行存在,或者它/它们不存在。在任何情况下,子查询的结果都是true或false。