Sql-Server

使用平均列索引視圖

  • November 5, 2021

使用 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()具體化它們,然後在單獨的正常視圖中進行它們之間的計算。

引用自:https://dba.stackexchange.com/questions/302118