2012-08-03 97 views
0

使用Sql Server 2008,是否适合使用View来跟踪表计数。例如。Sql server:跟踪视图中的计数?

CREATE VIEW [dbo].UserCounts  
    SELECT  O.UserId, Count(O.OrderId) AS OrderCount 
    FROM  User U INNER JOIN Orders O ON U.UserId = O.UserId 
    GROUP BY O.UserId 

这是一个可行的解决方案,拥有100.000名用户和约。 500.000个订单?

由于提前, 安德斯

回答

1

您可以创建一个索引视图,但必须使用COUNT_BIG代替:

CREATE VIEW dbo.UserCounts  
WITH SCHEMABINDING 
AS 
    SELECT  O.UserId, 
     COUNT_BIG(O.OrderId) AS OrderCount 
    FROM  dbo.User U 
    INNER JOIN dbo.Orders O ON U.UserId = O.UserId 
    GROUP BY O.UserId; 
go 

CREATE UNIQUE CLUSTERED INDEX cdxUserCounts on dbo.UserCounts(UserId); 
go 

这样发动机会维持数是最新的,而不是每次查询视图时对它们进行计数。缺点是争用,您不能为不同的交易创建/删除同一用户的订单。

+0

谢谢!伟大的建议。如果数据库是从多个网站访问的,你是否会看到很高的争用风险? – Vindberg 2012-08-03 10:05:12

+0

只有你可以回答这个问题:) – 2012-08-03 11:07:46

0

此视图将在您每次访问此视图时执行内嵌查询。所以我认为只是在视图上创建索引将无济于事。主要的是在底层2个用户和订单上有适当的索引。