我有一个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
子句快吗?
答案 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