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

时间:2013-06-08 04:21:00

标签: sql 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子句快吗?

2 个答案:

答案 0 :(得分:10)

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的查询一样快。

答案 1 :(得分: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