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

ale*_*lex 44 sql-server indexing aggregate view

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

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

Rem*_*anu 80

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

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

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

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

  • 如果您将表限制为仅允许“插入”操作,而不允许“更新”或“删除”,则可以支持它们。(如果你想做其中一个,你必须删除索引视图并在之后重新创建它。)相当多的表在实际使用中是仅插入的,并且会受益于加速 `max` 和`min` 查询。 (3认同)
  • 事实上,改变的行只能与缓存的数据结果进行比较,选择最高的为MAX,最低的为MIN。他们为什么不这样做? (2认同)
  • 我对AVG有点困惑。既然支持Count_BIG和SUM,为什么不支持AVG呢?无需重新扫描。 (2认同)
  • 您可以通过分别存储总和和总计“SUM(CatsQty) AS TotalCats, COUNT_BIG(*) AS TotalCount”并在 SELECT 中使用“SELECT TotalCats / TotalCount AS AverageCatsQty FROM AnimalsView”立即计算来制作自己的 AVG。当然,这只是平均值。 (2认同)