2011-05-06 128 views
13

是否有关于是否使用嵌套视图的一般性最佳做法?使用嵌套视图时性能是否受到影响?有没有一种最佳实践表明,除非你深入4层或更多层,否则实际上并没有性能问题。Sql Server 2008嵌套视图

我问这个问题的原因是因为我在努力是否使用它们。获得报告请求并不罕见,我只能通过将20个或更多的表连接在一起来访问这些信息。字段不是从所有表中返回的,但是需要选择正确的数据。在这种情况下,我喜欢嵌套视图并为其他报告重新使用较低级别的视图,因为如果需要更改逻辑,我只需更新一个视图并更新所有报告。我使用的许多表格都包含数百万和数百万条记录。

但也许这不是一个好的做法。你介意分享你的想法吗?

+2

视图做聚合吗?你是否加入了相同的基表?看看执行计划,看看你是否得到次优计划。 – 2011-05-06 16:04:32

+0

你能提供一个“嵌套视图”的例子吗?我只熟悉术语:内嵌视图(AKA派生表),非物化视图和物化视图(SQL Server中的AKA索引视图)。 – 2011-05-06 16:07:15

+1

@OMG - 我把它的意思是指引用其他视图的引用其他视图的视图... – 2011-05-06 16:08:54

回答

11

我会不惜一切代价避免这种情况。首先,您嵌套视图时,他们不能被索引。接下来,因为他们必须完全实现底层视图才能到达下一层。因此,您可以实现数百万条记录以获得5条记录的最终结果。我们几乎失去了一个数百万美元的客户,因为当我们的开发人员在一个数据库(而不是我输入的数据库)上完成这项工作时,性能非常糟糕。

最后,我发现这些图层很难维护,当您需要进行更改时。跟踪12层视图找到需要修复的视图并不是一件有趣的事情。我们也遇到了一个问题,因为开发人员发现添加另一个层比修复底层更容易,然后试图访问一个查询中的太多表,并且太多这些表是被访问的相同数百万记录表7或8次在不同层次的意见。

在我管理的数据库的视图中没有允许多个图层的情况,如果你这样做,我会生气。

+2

+1 SQL是一种情况,重复自己以避免嵌套视图是适当的。 – Matthew 2011-05-06 16:39:24

+6

优化器可以在嵌套视图中使用索引,除非视图逻辑很复杂并且会遮蔽索引。索引视图提供了一组不同的问题,但对于执行简单连接的普通视图,嵌套不会阻止优化器使用索引。 – 2013-09-18 15:17:46

+0

我的意思是你不能在视图上创建索引,而不能使用底层索引。但是,您可以非常快地达到优化程序无法弄清楚如何高效处理这一点。不仅如此,他们很快就变成了难以维系的混乱。这是一个SQL反模式,如果可能的话应该避免,它几乎总是可能的。 – HLGEM 2013-09-18 15:51:09

4

其他选项要考虑: 索引视图 - 如果使用不正确,使用会非常危险,但性能提升会非常惊人。

分析 - 比如分组集

程序&临时表 - 获取您通过程序需要的数据写出来给临时表的临时表中选择。

总的来说,我不喜欢视图或嵌套视图上的视图的性能命中。

通常,您可以使用表格之间的正确连接来生成一个视图,其中包含您之后的所有信息并使用条件筛选出数据。

+0

有关索引视图的问题。视图是否需要明确指定,或者优化器是否会选择一个索引视图,即使您要访问某些基表,但在执行路径中它确定视图更好。 – user742085 2011-05-06 16:43:05

+1

所以我找到了答案该视图不需要在查询中直接引用优化器在查询执行计划中使用它。 – user742085 2011-05-06 16:45:07

+0

@user - 根据版本。这只发生在Enterprise和Developer版本中,否则你需要明确引用视图并使用'noexpand'提示。 – 2011-05-06 17:03:18