0

我有表 User 和表 Order,现在我想查找超过 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;
4

2 回答 2

1

预计创建视图不会使这更快。在幕后仍然需要做同样多的工作。该视图只是使您的查询文本更易于查看;它并没有使它更容易执行。(但请注意,您正在使用两个不同的查询,一个是子查询,一个是连接。这与视图的使用正交:您可以在子查询中使用视图,或者您可以在没有观点。将这两件事混在一起很可能会引起混淆。)

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

于 2013-11-05T22:30:58.013 回答
0
SELECT U.name,count(*)
FROM User U
JOIN Orders o on o.uid=u.uid
WHERE COUNT(*) > 100
GROUP BY U.NAME

你不需要一个视图...

于 2013-11-05T21:25:33.543 回答