情景:
我有3个表需要连接在一起,一个where子句来限制结果集,并且每个表中只有几列被选中。简单。但是,执行此操作的查询并不是很漂亮,并且在数据库和应用程序之间使用ORM时,它就像尝试将方形挂钩放入圆孔中一样。
我解决这个问题的方法是创建一个包含查询的视图,现在我的应用程序模型直接映射到数据库中的视图;没有更多的疯狂映射ORM层。
问题: 假设没有其他因素在这里发挥作用,对视图的查询是否会产生任何额外的性能损失,如果我直接执行SQL语句,我不会遇到这种情况? - 这不是索引视图,假设相同的where子句,请保持简单。
我被引导相信一个观点遭受“正在建立”的额外开销。我的理解是,在其他所有情况相同的情况下,两者应具有相同的性能。
请澄清。谢谢!
答案 0 :(得分:4)
来自MSDN: View resolution
当SQL语句引用非索引视图时,解析器和查询优化器会分析SQL语句和视图的来源,然后将它们解析为单个执行计划。 SQL语句没有一个计划,也没有单独的视图计划。
不应该有任何不同的表现。视图可以帮助您组织,而不是任何性能增强。除非您使用索引视图。
仅存储非索引视图的定义,而不存储视图的行。查询优化器将视图定义中的逻辑合并到它为引用非索引视图的SQL语句构建的执行计划中。
答案 1 :(得分:3)
在Oracle中,性能是一样的。视图实际上是一个命名的sql语句。但是发烧友。
当您开始嵌套视图,并将视图与其他表或视图连接时,事情变得非常复杂。如果Oracle无法将过滤器向下推到表的视图中,那么它通常必须实现(构建临时表)部分查询,这就是当你遇到糟糕的性能时。