为什么索引视图不能有MAX()聚合?

时间:2010-01-25 18:09:24

标签: sql-server view indexing aggregate

我一直在尝试一些索引视图并给我留下了深刻的印象,但我几乎总是需要最大或最小,并且无法理解为什么它不适用于这些,有人可以解释原因吗?

我知道他们不被允许,我只是无法理解为什么!允许计数等为什么不MIN / MAX,我正在寻找解释......

4 个答案:

答案 0 :(得分:77)

不允许使用这些聚合,因为它们不能仅根据更改的值重新计算。

只需查看更改的数据,即可重新计算某些聚合,例如COUNT_BIG()SUM()。这些在索引视图中是允许的,因为如果基础值发生更改,则可以直接计算该更改的影响。

其他聚合,例如MIN()MAX(),只能通过查看正在更改的数据来重新计算。如果删除当前为max或min的值,则必须在整个表中搜索并找到新的max或min。

同样的原则适用于其他聚合,例如AVG()或标准变体聚合。 SQL无法仅根据更改的值重新计算它们,但需要重新扫描整个表以获取新值。

答案 1 :(得分:2)

除了Remus指定的原因外,支持MIN和MAX的实际需求也较少。与COUNT()或SUM()不同,MAX和MIN可以快速计算 - 只需一次查找即可设置;你不需要阅读大量数据。

答案 2 :(得分:1)

索引视图中不支持MIN / MAX等聚合函数。您必须在视图周围的查询中执行MIN / MAX。

在索引视图here(SQL 2005)中有关于什么是允许的和不允许的完整定义。
引用:

  

AVG,MAX,MIN,STDEV,STDEVP,VAR,   或VARP聚合函数。如果   AVG(表达式)在。中指定   引用索引视图的查询,   优化器可以经常计算   视图选择时所需的结果   列表包含SUM(表达式)和   COUNT_BIG(表达式)。例如,一个   索引视图SELECT列表不能   包含表达式AVG(column1)。   如果视图SELECT列表包含   表达式SUM(column1)和   COUNT_BIG(column1),SQL Server即可   计算查询的平均值   引用视图并指定   AVG(列1)。

答案 3 :(得分:0)

如果您只想在不使用排序依据的情况下查看已排序的事物,则只需在其中添加和排序依据即可。

id = row_number() over (order by col1, col2)