2012-08-03 45 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個用戶和訂單上有適當的索引。