我一直在尝试一些索引视图并给我留下了深刻的印象,但我几乎总是需要最大或最小,并且无法理解为什么它不适用于这些,有人可以解释原因吗?
我知道他们不被允许,我只是无法理解为什么!允许计数等为什么不MIN / MAX,我正在寻找解释......
答案 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)