我正在创建一个具有一些复杂底层关联的Web应用程序。为了解决我遇到的几个问题,我创建了一个UNION View。可能有很多其他方法可以解决。
但我现在正在考虑我的设计效率,我想知道每次查询时是否新创建了一个VIEW,或者它是否只创建一次,并保持更新。
详细说明,如果我有table_a(100条记录)和table_b(100条记录)并制作UNION视图,那么我创建了一个包含200条记录的视图。
每次针对View进行选择时,是否会发生整个过程?
同样,显然每次更新基础表记录时视图都会更新,但视图是否更新了这一条记录,还是从头开始重新创建整个视图?
戴尔
答案 0 :(得分:15)
视图只不过是带有名称的查询。有可能与性能相关的优化,有些DBMS比其他更好地实现(pgSQL似乎更好),比如重用查询计划,缓存访问控制等。
然而,在他们的一天结束时,几乎总是,您可以期望视图的行为就像直接发布SQL一样。不同的是,您可以授予对此查询的访问权限,而无需授予对基础表的访问权。
你可以做的改进可以改变行为(使它们像半桌一样),并且pgSQL中可能存在或者可能不存在,例如物化视图(抱歉不知道pgSQL),但这只是挑剔。
答案 1 :(得分:4)
使用EXPLAIN查看如何执行VIEW,您将看到与普通查询相同的结果。
EXPLAIN
SELECT * FROM name_of_your_view WHERE foo = 23;
PostgreSQL将尝试优化内部查询,即使您加入视图,使用其他视图也有视图等。尽量避免在优化程序执行(伟大)作业之前必须执行VIEW的情况。聚合,ORDER BY和LIMIT是在嵌套视图中使用时潜在问题的示例。只需使用EXPLAIN即可查看正在发生的事情。
答案 2 :(得分:3)
每次针对View进行选择时,是否会发生整个过程?
是。
非物化视图(PostgreSQL不支持物化视图)只是一个准备好的SQL语句 - 通过用包含视图所基于的SELECT的子查询替换视图引用,可以获得相同的性能。
这就是为什么每次在视图上运行查询时都会出现基于支持表的值的原因,我不清楚是否在PostgreSQL中显示列操作而不刷新视图 - IE:如果基于创建视图SELECT * FROM table_x,然后在table_x中添加或删除一列 - 大多数数据库都要求您刷新视图以通过视图查看更改。
应该阻止在观点之上构建视图 - 它们很脆弱;如果出现问题,在运行依赖于另一个视图的视图之前,您将不会知道。而且没有性能提升 - 恰恰相反。代码重用在基于SET的环境中表现不佳......