6

我有一个 PostgreSQL 函数,它向 pgadmin 结果网格返回查询结果真的很快。在内部,这是一个简单的函数,它使用 adblink连接到另一个数据库并执行查询返回,以便我可以简单地运行

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

于 2013-06-08T04:37:32.287 回答
5

这样做:

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
于 2017-10-24T18:17:33.247 回答