如果您打算使用视图,那么如何确保良好的性能?
还是最好不要先使用视图,而只是将等效视图合并到您的select语句中?
如果您打算使用视图,那么如何确保良好的性能?
还是最好不要先使用视图,而只是将等效视图合并到您的select语句中?
Answers:
这完全取决于您通过视图查看的内容。但最有可能减少您的精力并提供更高的性能。当SQL语句引用非索引视图时,解析器和查询优化器将分析SQL语句和视图的源,然后将它们解析为一个执行计划。SQL语句没有一个计划,而视图则没有一个单独的计划。
视图未编译。它是由其他表组成的虚拟表。创建它时,它不会驻留在服务器上的某个位置。组成该视图的基础查询要经受与查询优化器相同的性能提升或影响。我从未在视图VS底层查询上测试过性能,但是我想性能可能会略有不同。如果数据是相对静态的,则可以在索引视图上获得更好的性能。这可能就是您在“编译”方面的想法。
到目前为止尚未提及但有很大不同的是对视图的源表进行适当的索引编制。
如上所述,视图并不驻留在您的数据库中,而是每次都会重新构建。因此,使数据库重建更容易的所有方面都会提高视图的性能。
通常,视图以对存储非常不利(没有标准格式)但对进一步使用(进行分析,向用户呈现数据等)非常有利的方式联接数据,并因此联接和聚合来自不同表的数据。
是否对在其上进行操作的列建立索引,对视图的性能产生巨大的影响。如果已对表及其相关列进行了索引,则访问该视图不会导致首先一次又一次地重新计算索引。(不利的是,这是在源表中处理数据时完成的)
!为您的CREATE VIEW语句中的JOINS和GROUP BY子句中使用的所有列编制索引!
如果我们讨论的是“如果您使用视图,如何确保性能”,而不是讨论视图的总体效果,那么我认为它归结为束缚(就像您自己一样)。
如果您只是编写视图以使查询在所有情况下都变得简单,那么您可能会遇到麻烦,但不要担心视图实际上在性能方面是有用的。最后,您正在执行的任何查询都应该运行正常(请参阅@eggyal链接中的注释示例)。当然这是一个重言式,但因此价值不菲
您尤其需要谨慎,不要仅从视图中创建视图,仅因为这样做可能会使创建该视图更容易。
最后,您需要查看使用视图的原因。任何时候这样做都可以简化编程端的工作,使用存储过程恕我直言可能会更好。
为了控制一切,您可能需要写下为什么拥有某种视图,并决定为什么要使用它。对于编程中的每个“新”用途,请重新检查您是否确实需要视图,为什么需要它,以及是否仍然可以使用一个合理的执行路径。继续检查您的使用以使其保持快速运行,并继续检查是否确实需要该视图。