小编典典

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

sql

我有一个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这种情况下的子句快的吗?


阅读 222

收藏
2021-04-22

共1个答案

小编典典

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

2021-04-22