二是如果视图中包含Group By语句的话,在最好不要采用索引视图。虽然Group
By语句需要对数据进行聚合操作。但是他是高基数度的数据聚合。高基数度表示健包含许多不同的值。如需要采用Group
By语句对数以万计的用户数据进行分组,则这个分组对象的数值会很大。这个用户的数量就是基数度。唯一键具有可能的最高基数度,因为每个键具有不同的值。索引视图通过减少查询必须访问的行数来提高性能。如果视图结果集中的行数像基表中的行数那么多,那么使用视图获得的性能收益微乎其微。
三、 索引视图的几个典型应用。
笔者在这里根据自己的数据库设计经验,谈谈索引视图的两个主要应用。希望这两个例子能够给大家带来一定的启发。
如某个商品零售企业,其在不同的地方有多个零售门店。为了便于管理,不同的零售门店都采用独立的数据库表来记录他们的销售情况。到月底的时候,需要对各个,门店的销售记录进行汇总,最终要统计在一张表中。此时,该如何处理呢?通常情况下,是先对各个门店的销售情况进行汇总,统计出每个类别的销售金额。然后再把各个表的内容进行连接,放在同一张报表中。如果从数据库设计的角度讲,那么就是先对每张销售情况表进行聚合操作,然后再利用Union语句把它们连接起来。Union语句就是将两个SQL语句的结果合并起来。如要实现以上目的,我们可以通过SQL1
语句 Uinon
SQL语句2这种方式实现目的。但是,如果这些数据用于决策分析系统,每次用到的时候都需要重新查询,就会大大的增加数据库的查询负担。为此,就要建立索引视图。不过可惜的是,索引视图不支持Uinon操作符。那该如何处理呢?通常情况下,笔者都是这么做的。第一步先对每个门店的销售表进行汇总统计,此时可以利用索引视图来提高查询的速度。第二步再用SQL语句来查询这几个索引视图中的数据并利用Uinon语句进行连接。也就是说,不直接从数据库基表中查询数据进行连接,而是从索引视图中进行连接。这虽然不能够提高Uinon操作的速度,但是因为每个表的聚合操作时间缩短了,那么其Uinon连接的时间相对来说,也就缩短了。
再如,现在各个门市店的销售情况都是在独立的SQL数据库中记录。然后在季末或者年末需要它们他们的数据连接起来。此时,又该如何处理呢?基本上跟上面的操作步骤类似。第一步统计每个数据库中的销售情况,对某些数据进行汇总操作。第二步就利用Union等操作符把它们的结果连接起来。但是由于索引视图不能够同时引用多个数据库中的表,所以不能够设计单个索引视图来完成这项任务。笔者的做法是,先在每个数据库中建立一张索引视图,来统计这些销售情况,即对每个数据库单独的执行聚合操作。然后再通过连接操作把它们的结果连接起来。这个跟上面的一样,索引视图并不能够直接提高连接操作的性能。他也是通过缩短各个数据库系统聚合操作的时间来实现缩短整个连接操作时间的目的。所以,其连接操作的总体速度会加快。
四、 如何创建索引视图?
其实,索引视图的创建非常简单。只需要在创建视图的时候,加入一个WITH
SCHEMABINDING的关键字即可。所以,要创建索引视图不难。其最大的难度还在于数据库工程师需要根据实际的情况,来判断是否需要采用索引视图。即需要应用场景,来分析此时采用索引视图能够改善视图的性能。