Sql Server 2008嵌套视图

use*_*085 14 sql sql-server view sql-server-2008

是否使用嵌套视图是否有一般的最佳实践?使用嵌套视图时是否有性能损失?是否有一种最佳实践表明,在你深入4层或更深层之前,确实没有性能影响?

我问这个的原因是因为我在努力决定是否使用它们.获取报告请求并不罕见,我可以访问该信息的唯一方法是将20个或更多表连接在一起.不从所有表返回字段,但需要选择正确的数据.在这种情况下,我喜欢嵌套视图并重用其他报表的低级视图,因为如果需要更改逻辑,我只需更新一个视图,所有报表都会更新.我使用的许多表都包含数百万条记录.

不过这可能不是一个好习惯.你介意分享你的想法吗?

HLG*_*GEM 12

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

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

在我管理的数据库中,我不允许在视图中允许多个图层,如果您这样做,我会生气.

  • 优化器可以在嵌套视图中使用索引,除非视图逻辑复杂并且模糊了索引.索引视图提供了一组不同的问题,但对于执行简单连接的普通视图,嵌套不会阻止优化器使用索引. (7认同)
  • +1 SQL是一种重复自己以避免嵌套视图的情况. (2认同)
  • 视图可用于捕获多个级别重复需要的连接关系.例如,我有一个市场表.每个市场都属于一个扇区,所以我也有一个Sector表,而Market表有一个带有适当外键的SectorId.每个扇区都属于一个MacroSector,所以我也有一个MacroSector表,而Sector表有一个带有适当外键的MacroSectorId.现在,如果我告诉你许多使用市场的东西也需要部门和宏观部门,你真的要重写相同的连接关系几十次吗?*那是一团糟 (2认同)

小智 5

其他需要考虑的选项: 索引视图 - 如果使用不正确可能会有危险,但性能提升可能会很惊人.

分析 - 例如分组集

过程和临时表 - 通过过程获取所需的数据,将其写入临时表,从临时表中选择.

总的来说,我不喜欢在视图或嵌套视图上查看视图的性能.

通常,您可以使用表之间的正确连接生成一个视图,其中包含您之后的所有信息并使用条件过滤掉数据.