【发布时间】:2011-01-09 05:15:59
【问题描述】:
我一直在尝试一些索引视图并印象深刻,但我几乎总是需要一个最大值或一个最小值,并且无法理解为什么它不适用于这些,谁能解释为什么?
我知道他们是不允许的,我就是不明白为什么!!!计数等是允许的,为什么不是 MIN/MAX,我正在寻找解释...
【问题讨论】:
标签: sql-server view indexing aggregate
我一直在尝试一些索引视图并印象深刻,但我几乎总是需要一个最大值或一个最小值,并且无法理解为什么它不适用于这些,谁能解释为什么?
我知道他们是不允许的,我就是不明白为什么!!!计数等是允许的,为什么不是 MIN/MAX,我正在寻找解释...
【问题讨论】:
标签: sql-server view indexing aggregate
如果您只想在使用视图时查看排序的内容而不添加排序依据,我只需在其中添加一列并排序。
id = row_number() over (order by col1, col2)
【讨论】:
不允许使用这些聚合,因为它们不能仅根据更改的值重新计算。
某些聚合,如COUNT_BIG() 或SUM(),只需查看更改的数据即可重新计算。这些在索引视图中是允许的,因为如果基础值发生更改,则可以直接计算该更改的影响。
其他聚合,如 MIN() 和 MAX(),不能仅通过查看正在更改的数据来重新计算。如果您删除当前为最大值或最小值的值,则必须在 整个 表中搜索并找到新的最大值或最小值。
同样的原则适用于其他聚合,例如 AVG() 或标准变体聚合。 SQL 不能仅根据更改的值重新计算它们,而是需要重新扫描整个表以获取新值。
【讨论】:
insert 操作,而不是 update 或 delete,则可以支持它们。 (如果你想做其中一个,你必须删除索引视图并在之后重新创建它。)很多表在实际使用中是只插入的,并且会受益于加速max 和min 查询。
SUM(CatsQty) AS TotalCats, COUNT_BIG(*) AS TotalCount 并在您的 SELECT 中使用 SELECT TotalCats / TotalCount AS AverageCatsQty FROM AnimalsView 立即计算它来制作自己的 AVG。当然,这只是 MEAN 平均值。
除了 Remus 指定的原因之外,支持 MIN 和 MAX 的实际需求较少。与 COUNT() 或 SUM() 不同,MAX 和 MIN 的计算速度很快 - 只需一次查找即可完成;您不需要读取大量数据。
【讨论】:
索引视图不支持 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 列)。
【讨论】: