使用group by在视图上创建索引

时间:2015-05-06 12:15:05

标签: sql sql-server indexing view

所以我试图在我这里的示例视图上创建一个索引。起初我有COUNT_BIG错误,所以我添加了,但现在我得到了这个错误

  

无法创建聚簇索引...因为视图的选择列表包含结果上的表达式   聚合函数或分组列。

SELECT        
SALE_DATE, 
DATEPART(YEAR, SALE_DATE) AS SALE_YEAR, 
CAST(DATEADD(MONTH, DATEDIFF(MONTH, 0, SALE_DATE), 0) AS DATE) AS SALE_MONTH, 
CAST(DATEADD(QUARTER, DATEDIFF(QUARTER, 0, SALE_DATE), 0) AS DATE) AS SALE_QUARTER, 
REGION, 
A_ID, 
B_ID, 
ISNULL(SUM(SALE_VALUE), 0) AS SALE_VALUE, 
ISNULL(SUM(ADV_COMM), 0) AS ADV_COMM, 
ISNULL(SUM(CASH_COMM), 0) AS CASH_COMM, 
...
and a load more SUM columns in the exact same format
...
COUNT_BIG(*) AS COUNT 
FROM dbo.sale_data 
GROUP BY SALE_DATE, REGION, A_ID, B_ID

CREATE UNIQUE CLUSTERED INDEX CIX_View_daily_sale_data 
ON view_daily_sale_data_test(SALE_DATE, A_ID, B_ID, REGION);

我已经尝试了一切来解决这个问题,删除分组,更改我索引的列,删除CAST,我已经阅读了很多地方只要包含COUNT_BIG,就可以包含SUM。

有人可以解释一下我在这里做错了什么。谢谢!

1 个答案:

答案 0 :(得分:1)

错误信息不难解码:

  

包含表达式

ISNULL(...)
  

关于聚合函数的结果

SUM(...)

因此,您不能再对聚合函数的结果做任何事情。

在这里,我建议创建一个只执行SUM()操作的视图,并对其进行索引,然后,如果需要,另一个只查询第一个视图的视图未编入索引,并包含ISNULL()个表达式。查询第二个视图(如果使用了适当的提示,或者你是一个好的SKU),仍然应该从第一个视图的索引中获益。