我可以创建一个包含一些子行摘要的Sql Server索引吗



在Sql Server 2016中是否可以创建一些索引视图(或等效视图)来总结简单的父/子关系。

例如:

Parent: Vehicles
Children: Parts  (the parts that make up the car)
Children: Workers (the people who helped build the car)

结果是这样的。。例如:

Car   | Parts  | Workers
Car_A | 1111   | 4
Car_B | 123412 | 54
Car_C | 0      | 0

我想如果我把它写成一个SQL查询(我假设当时没有索引,必须"计算"整个答案):

SELECT          a.CarId
FROM            Cars a
LEFT OUTER JOIN Parts b ON a.CarId = b.CarId
LEFT OUTER JOIN Workers c ON a.CarId = b.CarId

现在,我追求"INDEXED"视图的原因是,我假设计算存储在磁盘上,所以我只需要扫描索引即可获得结果,而不必在执行时计算结果。

上面的例子(对于这个问题)也很懊悔。事实上,我有一个更大的表结构,等等。

我知道Indexed Views不能有特定的关键字,比如COUNT(正如@brentozar在博客文章中提到的)

我是不是看错了这个问题?我真的不想回复SQL缓存并更加积极主动。

(注意:也许我在另一个NoSql数据库中做了很多Map/Reduce查询:)

当然可以。数据被持久化到磁盘,因此查询速度更快,但缺点是必须在基础表/视图数据的每次更改时维护索引(或视图)。

更多信息,请阅读本文。

编辑:您只需要使用COUNT_BIG()而不是COUNT()来获取零件和工人编号。

第2版:在下面的作者评论之后,我发现我犯了一个错误,因为我还不明白这一切都是关于联接的。考虑到你正在对车辆进行聚合,我看不出有什么好的解决方案。。。

我能看到的唯一解决方案是,如果你愿意在数据中有一定的"滞后",那么你可以将数据转储到一个表中。你可以有一个作业,在一个临时表/表变量中计算select,然后在一个事务中截断一个表,并将新的聚合数据转储到其中。这样,你的数据可以从表中快速访问,新旧数据的交换也会很快,但正如我所提到的,它不会完全是实时数据。

最新更新