2014-01-31 59 views
0

我有PostgreSQL的9.1查询像是否可以缓存子查询的一些变量结果?

SELECT id 
FROM students 
INNER JOIN exams ON /some condition 
WHERE studentsid NOT IN (SUBQUERY); 

,当我只运行子查询它执行了120毫秒,当我与子查询它执行,持续12秒无条件执行以前的查询,但是当我添加子查询它运行一半小时 是否可以缓存子查询的某些变量结果(结果始终是相同的ID数组),并在console/pgadmin中执行? 我发现语句,但它看起来像在psotgre不支持

+1

首先,用左反连接或“NOT EXISTS”语句替换“NOT IN”。 PostgreSQL更有可能有效地优化它。然后查看查询的'EXPLAIN ANALYZE'输出以确定它正在做什么。如果你真的必须“缓存”子查询的结果,你可以创建一个“未记录”的表格,作为物化视图来维护。 –

回答

1

首先,with声明支持Postgres的。

其次,您需要确定性能问题的位置。它在子查询中吗?或者是not in

您可以将子查询放入表中,添加索引并使查询更高效。

您可以使用left join来重写子查询,这通常可以使查询得到更好的优化。

您可以添加适当的索引以使整个查询更高效。

不知道子查询实际上做了什么,正确的方法是猜测。