为什么索引视图不能有MAX()聚合?
我一直在尝试一些索引意见,并留下深刻的印象,但我几乎总是需要一个最大或最小,以及不明白为什么它不起作用,谁能解释为什么?
我知道他们不被允许,我只是不明白为什么! 计数等允许为什么不MIN / MAX,我正在寻找解释…
这些聚合是不允许的,因为它们不能仅仅基于改变的值重新计算。
一些聚合,如COUNT_BIG()
或SUM()
,可以通过查看更改的数据重新计算。 这些在索引视图中是允许的,因为如果基础值发生变化,那么可以直接计算出这个变化的影响。
其他聚合,如MIN()
和MAX()
,只是通过查看正在更改的数据不能重新计算。 如果删除当前为最大值或最小值的值,则必须在整个表格中search并find新的最大值或最小值。
同样的原则适用于其他集合,如AVG()
或标准变体集合。 SQL不能仅仅从已更改的值重新计算它们,而是需要重新扫描整个表以获取新值。
除了Remus指定的原因之外,支持MIN和MAX的实际需求较less。 与COUNT()或SUM()不同的是,MAX和MIN计算速度快 – 只需一次查找即可完成设置。 你不需要读大量的数据。
在索引视图中不支持像MIN / MAX这样的聚合函数。 您必须在围绕视图的查询中执行MIN / MAX。
这里有一个关于索引视图内容和不允许内容的完整定义(SQL 2005)。
引用:
AVG,MAX,MIN,STDEV,STDEVP,VAR或VARP聚合函数。 如果在引用索引视图的查询中指定AVG(expression式),则如果视图select列表包含SUM(expression式)和COUNT_BIG(expression式),则优化器可以频繁计算所需的结果。 例如,索引视图SELECT列表不能包含expression式AVG(column1)。 如果视图SELECT列表包含expression式SUM(column1)和COUNT_BIG(column1),则SQL Server可以计算引用视图并指定AVG(column1)的查询的平均值。