View不会提高相关子查询的性能?

时间:2013-11-05 21:22:17

标签: postgresql

我有表用户和表顺序,现在我想查找超过100个订单的用户名,我可以进行如下查询:

SELECT U.name
FROM User U
WHERE 100 < (
SELECT COUNT(*) FROM Orders O
WHERE O.uid=U.uid
)

由于相关子查询,这很慢。

因此我认为我可以通过创建一个视图来优化它,该视图包含每个用户的订单数量,如下所示

View UserOrderCount

uid    orderCount
0       11
1       108
2       100
3       99
4       32
5       67

然后查询更简单:

SELECT U.name
FROM User U, UserOrderCount C
WHERE 100 < C.orderCount And U.uid=C.cid;

但结果需要更多时间,我无法弄清楚为什么...... 请提前了解一下这个问题!

编辑:

以下是视图的创建方式:

CREATE VIEW UserOrderCount
AS
select U.uid, count(*) AS orderCount
from User U, orders O
group by U.uid;

2 个答案:

答案 0 :(得分:1)

创建视图不会让这更快。在幕后仍需要完成相同数量的工作。该视图只是使查询的文本更容易查看;它不会使执行起来更简单。 (但请注意,您正在使用两个不同的查询,一个是子查询,一个是连接。这与使用视图正交:您可以在子查询中使用该视图,或者您可以在没有子查询的情况下完成连接将这两件事混合在一起可能会引起混淆。)

使用物化视图,9.3中的新视图,它实际上会存储计数的计算结果,因此执行速度会更快。但是您为此付出的代价是您需要定期刷新物化视图,并且您将同时使用过时的计数。

答案 1 :(得分:0)

SELECT U.name,count(*)
FROM User U
JOIN Orders o on o.uid=u.uid
WHERE COUNT(*) > 100
GROUP BY U.NAME

你不需要那个视图...