我有一个PostgreSQL函数,可以将查询结果返回到pgadmin结果网格中。在内部,这是一个简单的函数,使用adblink连接到另一个数据库并返回查询,以便我可以简单地运行
dblink
SELECT * FROM get_customer_trans();
它的运行就像基本的表查询一样。
问题是当我使用该NOT IN子句时。因此,我想运行以下查询,但它要花很多时间:
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()不是表-可能是一些存储过程,因此查询并不是很简单。您需要查看此存储过程的实际作用,以了解为什么它可能运行缓慢。
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。