2015-07-04 39 views
5

我正在使用Microsoft SQL Azure v12.0託管的數據庫工作我使用索引顧問來幫助確定索引真正有益的地方,而不會超過索引我的數據庫。如何在索引視圖中模擬不同的計數?

我遇到了索引視圖會真正幫助消除每次有人運行查詢時需要大量數據的情況。

我試圖爲我的一張表製作索引視圖時遇到了一個令人費解的錯誤。
這是我數據庫中很常見的情況,所以我想知道是否有一個全面的通用解決方案,我可以在需要時重新調整用途。

我收到的錯誤是這樣的:

消息10126,級別16,狀態1,行12
不能創建視圖 「Database.dbo.vwCountDistinctExampleIX」 指標,因爲它使用了聚合 「COUNT_BIG」與DISTINCT關鍵字。
...
考慮使用GROUP BYCOUNT_BIG(*)視圖來模擬分組列上的DISTINCT

這個問題出現在我需要COUNT_BIG (DISTINCT {expression})時,這在索引視圖中顯然是不允許的。
錯誤消息似乎在暗示,你可以模擬COUNT DISTINCT行爲和使用DISTINCT,這將是非常好的,因爲它可以讓我索引列得到相同的結果沒有又一次有助於消除另一種昂貴GROUP BY條款常見的查詢(因爲執行計劃只能引用索引,而不是反覆重組表數據)。

我真的不明白COUNT_BIG (*)在這方面的工作原理,所以我不明白錯誤信息是什麼意思。
有沒有一種方法可以在不使用DISTINCT的情況下獲得該總值,同時仍然能夠對聚合列進行索引?

CREATE VIEW [vwCountDistinctExampleIX] WITH SCHEMABINDING AS SELECT 
             [T1].[ID]   , 
    COUNT_BIG (DISTINCT [T2].[Field2]) AS [DistinctTotal] , 
    COUNT_BIG (*)      AS [CountStar] 

    FROM [dbo].[Table1] [T1] 
    JOIN [dbo].[Table2] [T2] ON [T2].[Field1] = [T1].[ID] 

    GROUP BY [T1].[ID] 
GO 

CREATE UNIQUE CLUSTERED INDEX [PK vwCountDistinctExampleIX ID] -- Error here 
          ON [vwCountDistinctExampleIX] ([ID]) 

CREATE     INDEX [IX vwCountDistinctExampleIX DistinctTotal] 
          ON [vwCountDistinctExampleIX] ([DistinctTotal]) 
GO 

回答

2

我不認爲你可以直接在索引視圖中實現你想要的東西。但是,如果行的表2中的數量是很大的,但在Field2中不同值的數量沒有那麼大,下面的方法可能會有所幫助:

CREATE TABLE Table1 (ID INT PRIMARY KEY) 
CREATE TABLE Table2 (Field1 INT NOT NULL REFERENCES Table1, Field2 INT NOT NULL) 

INSERT INTO Table1 VALUES (1),(2),(3) 
INSERT INTO Table2 VALUES (1,10),(1,20),(1,20),(2,30) 

GO 
CREATE VIEW dbo.IndexedView1 
WITH SCHEMABINDING AS 
SELECT ID, Field2, COUNT_BIG(*) AS Cnt 
FROM dbo.Table1 T1 
INNER JOIN dbo.Table2 T2 ON T1.ID = T2.Field1 
GROUP BY ID, Field2 

GO 
CREATE UNIQUE CLUSTERED INDEX PK_IndexedView1 ON IndexedView1 (ID, Field2) 

GO 
CREATE VIEW SimpleView2 
AS 
SELECT ID, COUNT_BIG(*) AS DistinctTotal, SUM(Cnt) AS CountStar 
FROM dbo.IndexedView1 X 
GROUP BY ID 
1

你可以索引此查詢部分由兩列分組:

GROUP BY [T1].[ID], [T2].[Field2] 

查詢處理器足夠聰明,現在可以使用索引來計算獨特。

顯然,這種觀點比你想要的效率低,但總比沒有好。

相關問題