2

是否可以在 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

现在我在“索引”视图之后的原因是我假设计算存储在磁盘上,所以我只需扫描索引即可获得结果,而不必计算结果执行。

上面的例子也是悔恨的(对于这个问题)。实际上我有一个更大的表结构等等。

我明白索引视图不能有特定的关键字,比如COUNT(如@brentozar 在博客文章中提到的那样)

我是否以错误的方式看待这个问题?我真的不想回复 SQL 缓存并更主动一点,在这里。

(注意:也许我一直在另一个 NoSql 数据库中进行许多 Map/Reduce 查询 :))

4

1 回答 1

0

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

更多关于它,阅读这个

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

EDIT2:在下面作者的评论之后,我发现我犯了一个错误,因为我不明白这都是关于连接的。考虑到您正在汇总车辆,我看不到一个很好的解决方案......

我能看到的唯一解决方案是,如果您愿意在数据中有一定的“滞后”——那么您可以将数据转储到表中。您可以有一个工作来计算临时表/表变量中的选择,然后在事务中截断表并将新的聚合数据转储到其中。通过这种方式,您的数据可以从表中快速访问,并且旧数据与新数据的交换会很快,但正如我所提到的,它不会是完全实时的数据。

于 2017-01-09T08:19:58.457 回答