如何制定聚合不同值的 SQL Server 索引视图?

Posted

技术标签:

【中文标题】如何制定聚合不同值的 SQL Server 索引视图?【英文标题】:How to formulate a SQL Server indexed view that aggregates distinct values? 【发布时间】:2011-02-13 12:06:26 【问题描述】:

我有一个包含如下表的架构(伪架构):

TABLE ItemCollection 
   ItemCollectionId
   ...etc...


TABLE Item 
   ItemId,
   ItemCollectionId,
   ContributorId


我需要汇总每个 ItemCollectionId 的不同贡献者的数量。这可以通过如下查询来实现:

SELECT ItemCollectionId, COUNT(DISTINCT ContributorId) FROM Item
 GROUP BY ItemCollectionId

我还想使用索引(物化)视图预先计算此聚合。 DISTINCT 防止在此视图上放置索引。有什么方法可以重新制定这不会违反 SQL Server 的索引视图约束?

【问题讨论】:

【参考方案1】:
SELECT
   ItemCollectionId,
   COUNT(DISTINCT ContributorId),
   COUNT_BIG(*) AS DummyColumn
FROM Item
GROUP BY ItemCollectionId

聚合将需要 COUNT_BIG(*) as mentioned in MSDN。

这也表示“没有 DISTINCT”,我不确定(从未尝试过,抱歉)这是否适用于它在聚合中的使用(如您所见),或者 SELECT DISTINCT...

【讨论】:

没有骰子,只要您尝试创建聚集唯一索引,DISTINCT 就会杀死它。 @Jeremy Lew:在这种情况下,恐怕你必须使用触发器来维护一个表......【参考方案2】:

显然不可能。

【讨论】:

以上是关于如何制定聚合不同值的 SQL Server 索引视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 中的滑动窗口上聚合(计算不同的项目)?

SQL Server 索引视图:无法创建聚集索引,因为选择列表包含聚合函数结果的表达式

如何解决SQL Server查询速度缓慢的问题

SQL聚合中同一列内的多个值的不同计数

SQL SERVER数据库 唯一索引 非唯一索引 聚集索引 非聚集索引 之间区别

SQL Server——索引视图和SQL编程