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

问题描述 投票:44回答:4

我一直在尝试一些索引视图并印象深刻,但我几乎总是也需要一个最大值或一个最小值,并且不明白为什么它不适用于这些,有人可以解释为什么吗?

我知道他们是不允许的,我只是不明白为什么!!!允许计数等,为什么不允许MIN / MAX,我在寻找解释...

sql-server view indexing aggregate
4个回答
80
投票

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

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

[其他总计,例如MIN()MAX(),仅通过查看正在更改的数据就无法重新计算。如果删除当前为最大值或最小值的值,则必须在entire表中搜索并找到新的最大值或最小值。

相同的原理适用于其他聚合,例如AVG()或标准变异聚合。 SQL不能仅根据更改的值重新计算它们,而是需要重新扫描整个表以获取新值。


2
投票

除了Remus指出的原因外,几乎没有必要支持MIN和MAX。与COUNT()或SUM()不同,MAX和MIN的计算速度很快-只需一次查找即可全部设置好;您不需要读取大量数据。


1
投票

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

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

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


0
投票

如果您只想查看排序的事物,而在使用视图时不添加排序依据,我只需在其中添加和排序依据的列。

id = row_number() over (order by col1, col2) 
© www.soinside.com 2019 - 2024. All rights reserved.