Sql server:跟踪视图中的计数?

时间:2012-08-03 09:39:11

标签: sql-server optimization

使用Sql Server 2008,使用View来跟踪表计数是否合适。例如。

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个订单?

提前致谢, 安德斯

2 个答案:

答案 0 :(得分: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

这样引擎会将计数保持最新,而不是每次查询视图时都计算它们。缺点是争用,您无法从不同的交易中为同一用户创建/删除订单。

答案 1 :(得分:0)

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