Sql-Server
使用平均列索引視圖
使用 Sql-Server,我創建了這個視圖:
IF OBJECT_ID ('dbo.v_table', 'view') IS NOT NULL DROP VIEW [dbo].[v_table]; GO CREATE VIEW [dbo].[v_table] WITH SCHEMABINDING AS select toplevelcom_nr, avg(price_change), count(toplevelcom_nr) from dbo.table group by toplevelcom_nr
基礎表有11+ 百萬條記錄,視圖將列分組為12 個不同的值。通常,需要檢索數據的選擇查詢如下所示:
select * from [dbo].[v_table] where toplevelcom_nr = '12'
由於這個查詢相當緩慢,我需要獲得巨大的性能提升:大約需要5-10 sec,理想情況下應該是*< 1 sec*。
然後嘗試在視圖上設置索引時,它似乎不適用於平均列。
Go CREATE UNIQUE CLUSTERED INDEX idx_v_table ON [dbo].[v_table] (toplevelcom_nr); GO
導致:
消息 10125,級別 16,狀態 1,第 12 行無法在視圖“local.dbo.v_table”上創建索引,因為它使用聚合“AVG”。考慮消除聚合、不索引視圖或使用替代聚合。例如,對於 AVG 替換 SUM 和 COUNT_BIG,或者對於 COUNT,替換 COUNT_BIG。
來到我的問題:
是否有更智能的解決方案來提高性能?如果索引視圖不起作用,我是否必須保留表才能真正利用性能?
除了遵循您收到的錯誤消息的建議(這是索引視圖的限制)來利用
SUM()
andCOUNT_BIG()
函式來計算平均值之外,您還可以嘗試在表上使用列儲存索引。我在大型表上的列儲存索引方面取得了很多成功,我需要針對聚合執行分析查詢。也許您可以嘗試的一個範例是:
CREATE NONCLUSTERED COLUMNSTORE INDEX IX_Table_toplevelcom_nr_price_change ON Table (toplevelcom_nr, price_change)
如果您想堅持使用索引視圖,那麼您必須首先在索引視圖中使用
SUM()
並COUNT_BIG()
具體化它們,然後在單獨的正常視圖中進行它們之間的計算。